2016-04-27 192 views
0

我有巨大的用户更新表单。有时更新包含大量的字段,有时候只有一两个字段。这是我的代码:Laravel 5.2根据输入字段设置模型属性

public function updateUser(Request $request){ 
    $user = User::where('id',$request->id)->firstOrFail(); 

    if($request->first_name){ 
     $user->first_name= $request->first_name; 
    } 

    if($request->last_name){ 
     $user->last_name = $request->last_name; 
    } 

    if($request->job_name){ 
     $user->job_name= $request->job_name; 
    } 

    //etc.. 20 more fields 

    $user->save(); 

可以根据$request中的字段设置模型属性吗?有时候$request包含1个字段,有时候是20个。请注意我想要touch数据库只有一次,最后使用save()方法。

+0

您是指根据您的要求自动设置属性? – Abbasi

回答

2
$user->update($request->all()); 

确保所有必需的变量都在你的$fillable阵列指定User模型

如果您想更新模型而不保存使用fill方法

+0

感谢您的回答。但是update()函数会导致更新数据库。我只想在接触数据库之前将所有参数从请求分配到模型。触摸数据库应该在脚本的结尾使用save()方法完成。 – Fusion

+1

您正在查找的方法是'fill' https://laravel.com/api/5.2/Illuminate/Database/Eloquent/Model.html#method_fill –

+0

令人惊叹!这正是我正在寻找的。你能否请更新答案,以便我可以接受? – Fusion

0

如果$request字段名称和Model字段名称是相同的(因为它似乎在当前的代码)试试这个:

$input = $request->all(); $user = User::firstOrFail('id',$input->id); $updateNow = $user->update($input);

另一种选择是:

DB::table('users') ->where('id', $request->id) ->update($request); //or can use Input::all()

有一个看看它以及更多的解释:Query Builder

+0

感谢您的回答。但是update()函数会导致更新数据库。我只想在接触数据库之前将所有参数从请求分配到模型。触摸数据库应该在脚本的结尾使用save()方法完成。 – Fusion

+0

'save()'之前你还在做些什么? – Abbasi

0

用户模型属性

/** 
* The attributes that are mass assignable. 
* 
* @var array 
*/ 
protected $fillable = [ 
    'name', 'email', 'password', 'facebook_id', 'job_name', '20 more fields...' 
]; 

控制器

public function store(Request $request){ 
    $allRequest = $request->all(); 
    // It is not in table 
    unset($allRequest['_token']); 
    User::create($allRequest); 
}