Comment supprimer toutes les lignes d'une table en utilisant Eloquent?
Ma conjecture était d'utiliser la syntaxe suivante:
MyModel::all()->delete();
Mais cela n'a pas fonctionné. Je suis sûr que c'est super simple, mais j'ai cherché de la documentation sur le sujet et je ne peux pas la trouver!
12 réponses
La raison pour laquelle MyModel::all()->delete()
ne fonctionne pas est que all()
déclenche réellement la requête et renvoie une collection d'objets Eloquent.
, Vous pouvez utiliser la méthode tronquer, cela fonctionne pour Laravel 4 et 5:
MyModel::truncate();
Qui supprime toutes les lignes de la table sans enregistrer les suppressions de lignes individuelles.
Vous pouvez utiliser Model::truncate()
si vous désactivez foreign_key_checks
(je suppose que vous utilisez MySQL).
DB::statement("SET foreign_key_checks=0");
Model::truncate();
DB::statement("SET foreign_key_checks=1");
Solution Laravel 5.2 + .
Model::getQuery()->delete();
Prenez simplement le constructeur sous-jacent avec le nom de la table et faites n'importe quoi. Ça ne pourrait pas être plus propre que ça.
Laravel 5.6 solution
\App\Model::query()->delete();
J'ai vu les deux méthodes utilisées dans les fichiers de départ.
// Uncomment the below to wipe the table clean before populating
DB::table('table_name')->truncate();
//or
DB::table('table_name')->delete();
Même si vous ne pouvez pas utiliser la première, si vous souhaitez définir clés étrangères.
Impossible de tronquer une table référencée dans une contrainte de clé étrangère
Donc, il pourrait être une bonne idée d'utiliser la seconde.
Il y a un moyen indirect:
myModel:where('anyColumnName', 'like', '%%')->delete();
Exemple:
User:where('id', 'like' '%%')->delete();
Laravel générateur de requêtes d'informations: https://laravel.com/docs/5.4/queries
Je voulais ajouter une autre option pour ceux qui arrivent à ce fil via Google. J'avais besoin d'accomplir cela, mais je voulais conserver ma valeur d'incrément automatique qui truncate()
se réinitialise. Je ne voulais pas non plus utiliser DB::
quoi que ce soit parce que je voulais fonctionner directement à partir de l'objet modèle. Donc, je suis allé avec ceci:
Model::whereNotNull('id')->delete();
Évidemment, la colonne devra réellement exister, mais dans un modèle éloquent Standard, prêt à l'emploi, la colonne id
existe et n'est jamais nulle. Je ne sais pas si c'est la meilleure choix, mais cela fonctionne pour mes besoins.
La meilleure façon d'accomplir cette opération dans Laravel 3
semble être l'utilisation de l'interface Fluent
pour tronquer la table comme indiqué ci-dessous
DB::query("TRUNCATE TABLE mytable");
Je n'ai pas pu utiliser Model::truncate()
comme il le ferait d'erreur:
SQLSTATE[42000]: erreur de syntaxe ou violation d'accès: 1701 impossible de tronquer une table référencée dans une contrainte de clé étrangère
Et malheureusement Model::delete()
ne fonctionne pas (au moins dans Laravel 5.0):
La méthode non statique Illuminate \ Database\Eloquent \ Model:: delete() ne doit pas être appelée statiquement, en supposant $this à partir d'un contexte incompatible
Mais cela fonctionne:
(new Model)->newQuery()->delete()
Ce sera soft-supprimer toutes les lignes, si vous avez configuré soft-delete. Pour supprimer complètement toutes les lignes, y compris celles supprimées, vous pouvez passer à ceci:
(new Model)->newQueryWithoutScopes()->forceDelete()
Peut aussi faire une boucle foreach..
$collection = Model::get();
foreach($collection as $c) {
$c->delete();
}
Dans la même veine que la réponse de Travis vignon, j'avais besoin de données du modèle eloquent, et si les conditions étaient correctes, j'avais besoin de supprimer ou de mettre à jour le modèle. J'ai fini par obtenir le champ minimum et maximum renvoyé par ma requête (au cas où un autre champ serait ajouté à la table qui répondrait à mes critères de sélection) avec les critères de sélection d'origine pour mettre à jour les champs via une requête SQL brute (par opposition à une requête éloquente par objet dans la collection).
Je connaître L'utilisation de SQL brut viole laravels belle philosophie de code, mais il est difficile d'estomac peut-être des centaines de requêtes à la place d'un.
Solution qui travaille avec Lumen 5.5 avec des contraintes de clés étrangères:
$categories = MusicCategory::all();
foreach($categories as $category)
{
$category->delete();
}
return response()->json(['error' => false]);
Vous pouvez essayer ce one-liner qui préserve aussi les soft-deletes:
Model::whereRaw('1=1')->delete();