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