Laravel 5.2 $可填充
Laravel 5.2 $fillable
比方说,我的模型具有以下数据库结构:
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
,这个解决方案也更好,我就是这种情况。
如果您使用创建或更新功能,则需要受保护的 $fillable。但是,我认为您在不使用受保护的 $fillable 属性.
的情况下以这种方式解决了它
$yourmodel = YourModel::find($id);
$yourmodel->name = $request->input("name");
$yourmodel->last_name = $request->input("last_name");
$yourmodel->save();
您可以这样使用可填充数组:
// 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()
的数据;
您也可以为此制作中间件。
您可以在请求中使用 only()
或 except()
方法来限制字段,而不是使用 input()
或 all()
。例如:
$user = User::find(1);
$user->update($request->only(['name', 'last_name']));
// or
$user->update($request->except(['middle_name']));
编辑
如果要获取 table 的列名,可以使用 Schema::getColumnListing($tableName);
来完成。因此,在这种情况下,您的代码将类似于:
$user = User::find(1);
$user->update($request->only(Schema::getColumnListing($user->getTable())));
比方说,我的模型具有以下数据库结构:
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
,这个解决方案也更好,我就是这种情况。
如果您使用创建或更新功能,则需要受保护的 $fillable。但是,我认为您在不使用受保护的 $fillable 属性.
的情况下以这种方式解决了它$yourmodel = YourModel::find($id);
$yourmodel->name = $request->input("name");
$yourmodel->last_name = $request->input("last_name");
$yourmodel->save();
您可以这样使用可填充数组:
// 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()
的数据;
您也可以为此制作中间件。
您可以在请求中使用 only()
或 except()
方法来限制字段,而不是使用 input()
或 all()
。例如:
$user = User::find(1);
$user->update($request->only(['name', 'last_name']));
// or
$user->update($request->except(['middle_name']));
编辑
如果要获取 table 的列名,可以使用 Schema::getColumnListing($tableName);
来完成。因此,在这种情况下,您的代码将类似于:
$user = User::find(1);
$user->update($request->only(Schema::getColumnListing($user->getTable())));