模型中的 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 动态可填充的主要内容,如果未能解决你的问题,请参考以下文章