繁体   English   中英

检索 Laravel 中的可填写字段

[英]Retrieve fillable fields in Laravel

在 laravel 5.4 中,我可以使用fillable实例的可填写索引检索可填写字段。

$model = new AnyClass();
dd($model['fillable']);

上面的代码打印AnyClass的所有可填写字段。 但是相同的代码在 laravel 5.6 上打印null 我知道我可以使用$model->getFillable()检索可填写字段。 我的问题是什么原因/为什么它在 laravel 5.6 中不起作用但在 5.4 中起作用?

这里的升级指南中我相信这是问题的答案:

模型方法和属性名称

为了防止在使用数组访问时访问模型的私有属性,模型方法不再可能与属性或属性同名。 这样做会导致在通过数组访问( $user['name'] )或data_get辅助函数访问模型的属性时抛出异常。

如果您查看 Laravel 的源代码,您会看到不同之处。

由应用程序模型扩展的 Model 类实现了ArrayAccess接口,其中强制类定义offsetGet方法。

在 Laravel 5.4 中, offsetGet方法看起来像:

public function offsetGet($offset)
{
    return $this->$offset;
}

这意味着如果你调用$model['fillable'] $model->offsetGet('fillable') $model['fillable'] ,你实际上调用了$model->offsetGet('fillable') ,它实际上返回了类的fillable属性。

我找不到 Laravel 5.6 标签,但我很确定它与 Laravel 5.5.45 的代码相同。 在此版本中, offsetGet方法更改为:

public function offsetGet($offset)
{
    return $this->getAttribute($offset);
}

这意味着如果找到它,它实际上返回该属性,否则返回 null。

派对迟到了,但我不喜欢必须始终实例化 Model 的概念,特别是如果您使用Eloquent 序列化

假设您想构建一些过滤器,但想根据模型的可填充列将列列入白名单。 您不想实例化整个 model,因此您可以改用反射:

(new ReflectionClass(MyModel::class))->getDefaultProperties()['fillable']

在 3v4l.org 上查看它的工作情况- 在这里,我演示了为什么您可能不想实例化这个 model,因为它具有序列化和总是急切加载。

将类中的属性更改为public $fillable = [而不是protected $fillable = [

Laravel 7 中,我通过在我的模型的新实例上调用getFillable方法来做到这一点。 像这样:

$model = new MyModel();            
$fillable = $model->getFillable();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM