2013-02-14 102 views
23

如何更新Eloquent模型中的多个字段?比方说,我有这样的:Laravel 4:如何更新Eloquent模型中的多个字段?

$user = User::where("username", "=", "rok"); 

然后,我有所有这些模型参数:

$new_user_data = array("email" => "[email protected]", "is_superuser" => 1, ...); 

我不能只是做:

$user->update($new_user_data); 

什么是正确的方法是什么?我希望不是foreach

但是,下面的工作。这是要走的路吗?

User::where("id", "=", $user->id)->update($new_user_data); 

与最后一个问题(除了它是笨重的)是从对象上下文使用时,更新的字段不是在$this变量是可见的。

+0

是的,我认为更新多个列中,'更新时()'函数仅在直接更新模型时才有效。否则,你必须使用'fill()'和'save()'。 – Pathros 2016-03-30 18:38:06

回答

55

你正在寻找的方法是fill()

$user = User::where ("username","rok"); // note that this shortcut is available if the comparison is = 
$new_user_data = array(...); 
$user->fill($new_user_data); 
$user->save(); 

其实,你可以做$user->fill($new_user_data)->save();但我觉得单独的报表变得更容易阅读和调试。

+0

这是一个遗憾,他们没有更新()或保存()与新的数据...但这个工程。另外请务必查看Ardent软件包(它通过验证和更新独特功能使事情变得更加美好)。 – Tom 2014-04-11 19:46:18

+5

有没有人得到这个错误: - 调用未定义的方法Illuminate \ Database \ Query \ Builder :: fill() – Bik 2015-05-27 13:18:29

+0

适用于Laravel 5. Muchas gracias。 – racl101 2015-08-19 23:29:28

3

我建议使用更短的代码,如

$new_user_data=array('a'=>'n','b'=>'m'); 
    $user=User::whereUsername('rok');//camelCase replaces "=" sign 
    $user->fill($new_user_data)->save(); 

甚至更​​短的

$new_user_data=array('a'=>'n','b'=>'m'); 
    User::whereUsername('rok')->update($new_user_data);//camelCase replaces "=" sign 

我相信最后一句话是容易调试和看起来更好。
警告:如果您的表中包含许多名为'rok'的用户,则上述两个语句都会一次更新所有这些寄存器。您应该始终使用id字段值更新寄存器。

9

您正在寻找这样的:

$user = User::where("username","rok") 
       ->update( 
         array( 
          "email" => "[email protected]", 
          "is_superuser" => 1, 
          // .. 
          ) 
         ); 

参见:http://laravel.com/docs/4.2/eloquent#insert-update-delete

+0

尽管这个链接可能回答这个问题,但最好在这里包含答案的重要部分,并提供供参考的链接。链接的答案可能会失效,如果链接页面发生变化 – abarisone 2015-04-15 09:07:31

+0

@Kumar Ramalingam - 尼斯,谢谢:) – Sambhav 2016-04-13 15:47:41

+0

@Sambhav - 欢迎 – 2016-06-16 09:05:16

0

试试这个,

// took required data out of the request 
$postData = request(
    [ 
     'firstName', 
     'lastName', 
     'address1', 
     'address2', 
     'address3', 
     'postcode', 
     'phone', 
     'imageURL', 
    ] 
); 
// persisted it to the database 
DB::table('users') 
    ->where('id', auth()->user()->id) 
); 
相关问题