将 Eloquent 模型限制为特定列

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 ...

有人有解决方案吗?

更新: 请注意,我正在寻找模型级别的解决方案,而不是控制器级别。我可以从控制器端进行选择,但这违背了模型概念的目的,并且必须在每个查询中声明要选择的列。

谢谢!特洛伊

Kou*_*sha 7

您可以创建一个中间类并重载该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一个空数组,那么你会得到一切。

  • `all` 是静态函数,你宁愿覆盖 `get`,但这绝对不是 get 的方法。 (2认同)