在laravel 5.4中,我能够通过使用模型实例的fillable
索引来检索可填充字段。
$model = new AnyClass();
dd($model['fillable']);
上面的代码打印了AnyClass
的所有可填写字段。但是相同的代码在laravel 5.6上打印null
。我知道我可以使用$model->getFillable()
检索可填写的字段。我的问题是什么原因/为什么它不在laravel 5.6中工作但在5.4中工作?
如果你看一下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。
从升级指南here我相信这是问题的答案:
模型方法和属性名称
为了防止在使用数组访问时访问模型的私有属性,不再可能使用与属性或属性同名的模型方法。这样做会在通过数组访问(
$user['name']
)或data_get
辅助函数访问模型的属性时引发异常。
将类中的属性更改为public $fillable = [
而不是protected $fillable = [