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())));