【问题标题】: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();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-04-18
            • 2015-10-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-03-27
            • 2013-02-22
            • 1970-01-01
            相关资源
            最近更新 更多