2013-02-14 7 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

ответ

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

Жаль, что у них нет обновлений() или save() с новыми данными ... но это работает. Также не забудьте заглянуть в пакет Ardent (это делает все намного лучше с проверкой и обновлением uniques). – Tom

+5

Произошла эта ошибка: - Звонок на неопределенный метод Illuminate \ Database \ Query \ Builder :: fill() – Bik

+0

Работает на Laravel 5. Muchas gracias. – racl101

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

+0

@Kumar Ramalingam - Ницца, спасибо :) – Sambhav

+0

@Sambhav - Welcome –

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) 
); 
Смежные вопросы