模型中的 Laravel 动态可填充

Posted

技术标签:

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

遇到了 laravel 5.2 的问题。

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

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

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

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

以下是目前调试的方法:

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

    在model.php行(450)中,

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

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

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

提前致谢。

【问题讨论】:

【参考方案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

【讨论】:

确保你知道这会命中数据库。也许每次初始化模型时。

以上是关于模型中的 Laravel 动态可填充的主要内容,如果未能解决你的问题,请参考以下文章

从 laravel 中的数据库动态填充语言翻译数组

Laravel 5.1 Eloquent isFillable() 单元测试中的差异

Laravel:模型中的动态关系

Laravel 4.2 雄辩的动态查询

laravel 5.4中的动态播种

laravel中的数据迁移和数据填充