Laravel动态可填充模型

时间:2016-10-18 06:06:16

标签: php eloquent laravel-5.2 models

在laravel 5.2中遇到了问题。

以下是eloquent创建操作(后调用)

期间的错误

Model.php中的批量分配异常453:column_name

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

  1. 模型中的Fillables通过以下代码以动态方式填充:
    public function __construct() {
         $this->fillable(\Schema::getColumnListing($this->getTable()))
    }
    
  2. 以下是迄今为止调试过的方法:

    1. 在插入之前,在控制器中,$ model :: getillableField()提供适当的可填充数组。

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

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

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

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

    4. 提前致谢。

3 个答案:

答案 0 :(得分:6)

您真正要做的是将所有字段设为可填写。

在Laravel中执行此操作的正确方法是:

protected $guarded = [];

这适用于5.2,即使它的文档在5.3中找到。

relevant source code for 5.2

Documentation from 5.3):

  

如果您想使所有属性都可以分配,您可以将$ guarded属性定义为空数组:

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

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

答案 1 :(得分:5)

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

4

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

答案 2 :(得分:0)

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

<?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