让我们说,我的模型具有以下数据库结构:
name:string
last_name:string
我希望更新模型,并给出$request->input()
数组:
name => 'Quinn',
last_name => 'Daley',
middle_name => 'Phill'
我会收到一条错误消息,因为它会尝试更新数据库中不存在的middle_name
字段。
所以这是我的问题:
如何才能更新现有字段?不使用protected $fillable
属性。
编辑:我不想使用$ fillable的原因是我不想列出数据库中的所有现有字段。如果我有一个包含50个字段的大型模型怎么办?是否有可能只接受来自$request->input()
的模型数据库中存在的参数?
更新
使用$model->getAttributes()
:
$user->update($request->only(array_keys($user->getAttributes()))
如果您对模型使用不同的$connection
,这个解决方案也会更好,这是我的理由。
答案 0 :(得分:3)
您可以在请求中使用input()
或all()
方法来限制字段,而不是使用only()
或except()
。例如:
$user = User::find(1);
$user->update($request->only(['name', 'last_name']));
// or
$user->update($request->except(['middle_name']));
如果要获取表的列名,可以使用Schema::getColumnListing($tableName);
执行此操作。因此,在这种情况下,您的代码看起来像:
$user = User::find(1);
$user->update($request->only(Schema::getColumnListing($user->getTable())));
答案 1 :(得分:0)
protected $ fillable。但是,我认为你在不使用受保护的$ fillable属性的情况下以这种方式解决它。
$yourmodel = YourModel::find($id);
$yourmodel->name = $request->input("name");
$yourmodel->last_name = $request->input("last_name");
$yourmodel->save();
答案 2 :(得分:0)
您可以这样使用可填充数组:
// in your model
/**
* Get only available fields
*
* @param array $input
* @return array
*/
public function filterFields(array $input)
{
$fields = $this->fillable;
return array_filter($input, function ($v, $k) use ($fields) {
return in_array($k, $fields);
}, ARRAY_FILTER_USE_BOTH);
}
并过滤来自$request->input()
的数据;
你也可以为这个目的制作中间件。