【问题标题】:Laravel Dynamic Fillable in Models模型中的 Laravel 动态可填充
【发布时间】:2017-02-27 06:47:04
【问题描述】:

遇到了 laravel 5.2 的问题。

以下是 eloquent 创建操作(调用后)时的错误,

Model.php 453 中的批量赋值异常:column_name

以下是需要考虑的先决条件:

  1. model中的Fillables通过以下代码动态填充: 公共函数 __construct() { $this->fillable(\Schema::getColumnListing($this->getTable())) }

以下是目前调试的方法:

  1. 在插入之前,在控制器中,$model::getillableField() 会给出正确的可填充数组。

  2. 在model.php行(450)中,

    if ($this->isFillable($key)) { $this->setAttribute($key, $value); }

    上面的代码返回值为“false”,并且$model::getFillableField() 在数组列表中有column_name。

  3. 使用表列硬编码 $fillable 变量可消除错误。 请帮忙,我哪里出错了,解决办法是什么?

提前致谢。

【问题讨论】:

    标签: php eloquent laravel-5.2 models


    【解决方案1】:

    您真正想做的是使 ALL 字段可填写。

    在 Laravel 中正确的做法是这样的:

    protected $guarded = [];
    

    这在 5.2 中有效,尽管它的文档在 5.3 中找到。

    (relevant source code for 5.2)

    (Documentation from 5.3):

    如果你想让所有属性都可以批量赋值,你可以将 $guarded 属性定义为一个空数组:

    通过将$guarded 设置为一个空数组,您将创建一个空的黑名单,允许所有字段都可以批量分配。

    此外,如果此模型曾经将直接从用户输入构建,请不要这样做。 Laravel 要求定义 $fillable$guarded 是有原因的。除非您的模型具有字面上 1:1 的公共表单字段,否则允许所有字段在批量分配时可写是一个安全漏洞。

    【讨论】:

      【解决方案2】:

      试试这个。 将以下代码放入您的模型中,

      public function __construct()
      {
          $this->setFillable();
      }
      public function setFillable()
      {
          $fields = \Schema::getColumnListing('table_name_here');
      
          $this->fillable[] = $fields;
      }
      

      这使得每一列都可以从该表中填充。

      【讨论】:

        【解决方案3】:

        创建一个使用数据库列的特征。

        <?php
        
        namespace App\Traits;
        
        use Illuminate\Support\Facades\Schema;
        
        trait ColumnFillable
        {
            public function getFillable()
            {
                return Schema::getColumnListing($this->getTable());
            }
        }
        

        现在在你的模型中使用这个特性。

        <?php
        
        namespace App;
        
        use App\Traits\ColumnFillable;
        
        class MyModel extends Model
        {
            use ColumnFillable;
        
            ...
        

        现在您无需手动指定$fillable

        【讨论】:

        • 确保你知道这会命中数据库。也许每次初始化模型时。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-10
        • 1970-01-01
        • 1970-01-01
        • 2014-09-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多