Tro*_*roy 1 model laravel eloquent
我从一个相当大的数据库中提取,出于安全原因,我的数据库用户只能从学生表中选择有限数量的列:姓名、毕业日期和性别。但是在 select * 语句中返回了许多其他列。
在常规 SQL 中,如果我运行类似:
SELECT * FROM students
Run Code Online (Sandbox Code Playgroud)
将在该表上返回错误。如果我运行 eloquent 模型也一样
Students::all();
Run Code Online (Sandbox Code Playgroud)
也会返回错误。
我知道在 Eloquent 中,您可以在定义类似于以下内容的关系时限制您的选择:
class Students extends Eloquent {
protected $table = 'student_info';
public function classes() {
return $this->hasMany('classes')->select(array('room', 'time'));
}
}
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是,是否可以在主模型上完成选择限制,类似于在类表上进行限制。所以,当我运行Student::all();它时,它只选择我需要的列。
主要问题是每次运行学生查询时,我每次都必须执行特定的选择命令,而不仅仅是说“ Student::all()”。Student::find(1); 也一样。也会返回一个错误,因为它仍然运行一个SELECT * FROM student_info WHERE id = 1.
我尝试设置$visible变量,但它仍然呈现相当于SELECT * FROM ...
有人有解决方案吗?
更新: 请注意,我正在寻找模型级别的解决方案,而不是控制器级别。我可以从控制器端进行选择,但这违背了模型概念的目的,并且必须在每个查询中声明要选择的列。
谢谢!特洛伊
您可以创建一个中间类并重载该all()函数。让我们称这个类Elegant
优雅.php
abstract class Elegant extends Model
{
public static $returnable = [];
public function all()
{
return $this->get(static::$returnable)->all();
}
}
Run Code Online (Sandbox Code Playgroud)
然后扩展这个类,并为它定义可返回的列。
学生.php
<?php
class Student extends Elegant
{
public static $returnable = ['room', 'time'];
}
Run Code Online (Sandbox Code Playgroud)
现在根据需要使用它:Student::all()在您的控制器中。如果你留下returnable一个空数组,那么你会得到一切。
| 归档时间: |
|
| 查看次数: |
5625 次 |
| 最近记录: |