web-dev-qa-db-fra.com

Comment définir chaque ligne sur la même valeur avec Elavent / Fluent de Laravel?

J'ai besoin de mettre à jour toutes les lignes d'une base de données afin qu'un champ particulier dans tous soit égal à une seule valeur. Voici un exemple.

Disons que ma table de base de données ressemble à ceci:

id    |   data   |  confirmed
1     | someData |      0
2     | someData |      1
3     | someData |      0

Je souhaite effectuer une requête qui définit le champ confirmé de chaque ligne sur 1.

Je pourrais le faire de cette façon:

$rows = MyModel::where('confirmed', '=', '0')->get();
foreach($rows as $row) {
    $row->confirmed = 0;
    $row->save();
}

Mais il semble qu'il y aurait une meilleure façon? Une seule requête qui dirait simplement "définissez le champ" confirmé "de chaque ligne sur 1."

Une telle requête existe-t-elle dans Eloquent/Fluent de Laravel?

33
Pete

Eh bien, une réponse simple: non, vous ne pouvez pas le faire avec éloquence. Un modèle représente 1 ligne dans la base de données, cela n'aurait aucun sens s'ils l'implémentaient.

Cependant, il existe un moyen de le faire avec fluidité:

$affected = DB::table('table')->update(array('confirmed' => 1));

ou encore mieux

$affected = DB::table('table')->where('confirmed', '=', 0)->update(array('confirmed' => 1));
67
LHolleman

Juste pour garder ce fil à jour, vous pouvez mettre à jour toutes les lignes par rapport à un modèle Eloquent directement en utilisant:

Model::query()->update(['confirmed' => 1]);
56
Matt

Vous pouvez le faire avec éloquent (laravel 4):

MyModel::where('confirmed', '=', 0)->update(['confirmed' => 1])
18
styryl