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!

86
demandé sur Rishabh 2013-03-18 22:41:49

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.

156
répondu bilalq 2017-06-20 00:59:04

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");
46
répondu Fortex 2014-06-22 17:31:09

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();
42
répondu Yauheni Prakopchyk 2018-03-19 07:41:50

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.

21
répondu giannis christofakis 2017-09-06 11:25:09

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

12
répondu Rejaul 2017-06-15 10:49:54

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.

8
répondu lookitsatravis 2014-05-02 13:14:04

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");
4
répondu Pete 2013-10-18 06:47:03

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()
4
répondu Dave James Miller 2016-02-25 10:48:34

Peut aussi faire une boucle foreach..

$collection = Model::get();

foreach($collection as $c) {

$c->delete();

}
1
répondu Sam Solomon 2017-07-27 16:08:34

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.

0
répondu Sidney 2014-05-02 19:04:03

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]);
0
répondu Alain Berrier 2018-02-06 18:33:59

Vous pouvez essayer ce one-liner qui préserve aussi les soft-deletes:

Model::whereRaw('1=1')->delete();
0
répondu jfeid 2018-09-27 12:08:34