Laravel 5.2 $可填写

时间:2016-01-18 21:48:12

标签: php laravel laravel-5 eloquent laravel-5.2

让我们说,我的模型具有以下数据库结构:

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,这个解决方案也会更好,这是我的理由。

3 个答案:

答案 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()的数据; 你也可以为这个目的制作中间件。