Laravel动态填充模型


Laravel Dynamic Fillable in Models

在使用laravel 5.2时遇到问题。

下面是雄辩创建操作(post call)时的错误,

Model.php 453: column_name

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

  1. 模型中的可填充项由以下代码动态填充:<>之前公共函数__construct() {$ this -> fillable('模式:getColumnListing ($ this ->可以获得的()))}

目前调试的方法如下:

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

  2. 在model.php行(450),

    <>之前if ($this->isFillable($key)) {$ this -> setAttribute(键,价值美元);}之前

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

  3. 硬编码$fillable变量与表的列消除错误。请帮助,我在哪里走错了,什么是解决方案?

你真正想做的是使所有字段可填充。

在Laravel中正确的方法是:

protected $guarded = [];

尽管在5.3中可以找到它的文档,但它在5.2中可以工作。

(5.2的相关源代码)

(来自5.3的文档):

如果你想让所有属性都是可批量分配的,你可以将$ protected属性定义为一个空数组:

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

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

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

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

创建一个使用数据库列的trait

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