laravel - 将 Eloquent 模型限制为特定列

标签 laravel model eloquent

我正在从一个相当大的数据库中提取数据,出于安全原因,我的数据库用户只能从学生表中选择有限数量的列:姓名、毕业日期和性别。但是在 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 ...

的 sql

谁有解决办法?

更新: 请注意,我正在寻找模型级别的解决方案,而不是 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/

相关文章:

javascript - 使用阿拉伯语时数字会颠倒

routing - laravel路由和404错误

extjs - 如何一次为Ext.data.Model设置多个值?

java - 键入 DefaultListModel 以避免强制转换

Laravel 5.4 同步()上的 key 'PRIMARY' 的重复条目

php - Laravel Eloquent 连接不相关的表?

php - 如何从mysql中的多个表关系中检索数据

model - pylons:在模型层验证数据

php - Laravel:让 Eloquent 创建嵌套 SELECT 的正确方法

laravel - 将 Laravel 从 Laravel 5.4 更新到 Laravel 5.5