在Laravel中检索可填充字段

时间:2019-02-28 12:55:17

标签: php laravel laravel-5 eloquent laravel-5.6

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

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

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

4 个答案:

答案 0 :(得分:4)

根据升级指南here,我相信这是问题的答案:

  

模型方法和属性名称

     

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

答案 1 :(得分: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。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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