Vous trouverez de bonnes solutions à ce problème dans le billet suivant : https://github.com/laravel/ideas/issues/575
1) Il est possible de créer une fonction personnalisée pour ce faire, qui utilise le SQL brut, comme l'indique le commentaire de barryvdh dans l'article.
public static function updateValues(array $values)
{
$table = MyModel::getModel()->getTable();
$cases = [];
$ids = [];
$params = [];
foreach ($values as $id => $value) {
$id = (int) $id;
$cases[] = "WHEN {$id} then ?";
$params[] = $value;
$ids[] = $id;
}
$ids = implode(',', $ids);
$cases = implode(' ', $cases);
$params[] = Carbon::now();
return \DB::update("UPDATE `{$table}` SET `value` = CASE `id` {$cases} END, `updated_at` = ? WHERE `id` in ({$ids})", $params);
}
Il semblerait que les performances soient multipliées par 13
2) Comme indiqué dans un autre commentaire, une autre idée consiste à procéder par enregistrement, mais en effectuant l'ensemble en une seule transaction, ce qui est beaucoup plus rapide.
DB::beginTransaction();
// your loop and updates;
if( !$user )
{
rollbackTransaction();
} else {
// Else commit the queries
commitTransaction();
}
3) Il existe également une bibliothèque Laravel qui semble essayer de résoudre ce problème. https://github.com/mavinoo/laravelBatch
Note : Je n'ai essayé ni testé aucune des solutions ci-dessus.
0 votes
Dans votre modèle, définissez
protected $guarded = array();
$fillable
y$guarded
sont utilisées pour permettre l'insertion et la mise à jour en masse