Laravel 4: Comment mettre à jour plusieurs champs dans un modèle éloquent?

Comment puis-je mettre à jour plusieurs champs dans un modèle éloquent? Disons que je l'ai eu comme ceci:

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

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

$new_user_data = array("email" => "rok@rok.com", "is_superuser" => 1, ...);

je ne peux pas simplement faire:

$user->update($new_user_data);

Quelle est la bonne manière? Je n'espère pas un foreach.

Le code suivant fonctionne, cependant. Est-ce la voie à suivre?

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

le problème avec le dernier (en plus d'être clunky) est que lorsqu'on l'utilise à partir d'un contexte objet, la mise à jour les champs ne sont pas visibles dans l' $this variable.

25
demandé sur duality_ 2013-02-14 19:20:49

4 réponses

La méthode que vous cherchez 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 déclarations séparées un peu plus faciles à lire et à déboguer.

56
répondu J.T. Grimes 2014-12-13 19:55:58

Vous cherchez ceci:

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

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

9
répondu Kumar Ramalingam 2017-05-17 13:17:01

je devrais suggérer d'utiliser un code plus court, comme

    $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 affirmation est plus facile à déboguer et semble plus agréable.

Attention: si votre table contient beaucoup d'utilisateurs nommés 'rok' les deux déclarations mentionnées mettront à jour tous ces registres à la fois. Vous devez toujours mettre à jour les registres avec la valeur du champ id.

3
répondu Alejo Toro 2014-05-16 06:33:23

Essayez ceci,

// 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
répondu idro2k 2017-06-24 21:23:14