web-dev-qa-db-fra.com

Laravel 4: comment mettre à jour plusieurs champs dans un modèle Eloquent?

Comment mettre à jour plusieurs champs dans un modèle Eloquent? Disons que je l'ai comme ça:

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

Et puis j'ai tous ces paramètres de modèle:

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

Je ne peux pas simplement faire:

$user->update($new_user_data);

Quelle est la bonne façon? J'espère pas une foreach.

Ce qui suit fonctionne cependant. Est-ce le chemin à parcourir?

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

Le problème avec le dernier (en plus du fait qu'il soit maladroit) est que, lorsqu'il est utilisé à partir d'un contexte d'objet, les champs mis à jour ne sont pas visibles dans la variable $this.

25
duality_

La méthode que vous recherchez est 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();

En fait, vous pourriez faire $user->fill($new_user_data)->save(); mais je trouve les instructions séparées un peu plus faciles à lire et à déboguer.

57
J.T. Grimes

Vous recherchez ceci:

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

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

9
Kumar Ramalingam

Je devrais suggérer d'utiliser un code plus court, tel que 

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

Ou même plus court

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

Je crois que la dernière déclaration est plus facile à déboguer et est plus jolie .
Avertissement: Si votre table contient de nombreux utilisateurs nommés 'rok', les deux instructions mentionnées mettront à jour tous ces registres en même temps. Vous devez toujours mettre à jour les registres avec la valeur du champ id.

3
Alejo Toro

Essaye ça, 

// 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)
);
0
idro2k