【问题标题】:Retrieve fillable fields in Laravel在 Laravel 中检索可填写的字段
【发布时间】:2019-07-22 09:39:45
【问题描述】:
在 laravel 5.4 中,我可以使用模型实例的 fillable 索引来检索可填充字段。
$model = new AnyClass();
dd($model['fillable']);
上面的代码打印了AnyClass的所有可填写字段。但同样的代码在 laravel 5.6 上打印 null。我知道我可以使用$model->getFillable() 检索可填写的字段。我的问题是什么原因/为什么它在 laravel 5.6 中不起作用但在 5.4 中起作用?
【问题讨论】:
标签:
php
laravel
laravel-5
eloquent
laravel-5.6
【解决方案1】:
从升级指南here我相信这是问题的答案:
模型方法和属性名称
为防止在使用数组访问时访问模型的私有属性,不再可能拥有与属性或属性同名的模型方法。这样做会导致在通过数组访问 ($user['name']) 或 data_get 辅助函数访问模型的属性时引发异常。
【解决方案2】:
如果您查看 Laravel 的源代码,您会发现其中的不同。
由应用程序模型扩展的 Model 类实现了ArrayAccess 接口,除其他外,该接口强制该类定义offsetGet 方法。
在 Laravel 5.4 中,offsetGet 方法如下所示:
public function offsetGet($offset)
{
return $this->$offset;
}
这意味着如果你调用$model['fillable'],你实际上调用了$model->offsetGet('fillable'),它实际上返回了类的fillable属性。
我找不到 Laravel 5.6 标签,但我很确定它与 Laravel 5.5.45 的代码相同。在此版本中,offsetGet 方法更改为:
public function offsetGet($offset)
{
return $this->getAttribute($offset);
}
这意味着如果找到它实际上返回属性,否则返回 null。
【解决方案3】:
将类中的属性改为public $fillable = [而不是protected $fillable = [
【解决方案4】:
在 Laravel 7 中,我通过在我的模型的新实例上调用 getFillable 方法来做到这一点。像这样:
$model = new MyModel();
$fillable = $model->getFillable();