web-dev-qa-db-fra.com

Comment supprimer toutes les lignes d'un tableau avec Eloquent?

J'imaginais utiliser la syntaxe suivante:

MyModel::all()->delete();

Mais ça n'a pas marché. Je suis sûr que c'est très simple, mais j'ai recherché de la documentation sur le sujet et je ne le trouve pas!

96
Pete

La raison pour laquelle MyModel::all()->delete() ne fonctionne pas est que all() renvoie la requête et renvoie une collection d'objets Eloquent. 

Vous pouvez utiliser la méthode tronquée, cela fonctionne pour Laravel 4 et 5:

MyModel::truncate();

Cela supprime toutes les lignes de la table sans enregistrer les suppressions de lignes individuelles.

182
bilalq

Laravel 5.2+ solution.

Model::getQuery()->delete();

Il suffit de saisir le constructeur sous-jacent avec le nom de la table et de faire ce que vous voulez .

Laravel 5.6 solution

\App\Model::query()->delete();
50
Yauheni Prakopchyk

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");
49
Fortex

J'ai vu les deux méthodes être utilisées dans des 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 le premier 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 ce serait une bonne idée d'utiliser le second.

24

Il y a un moyen indirect:

myModel:where('anyColumnName', 'like', '%%')->delete();

Exemple:

User:where('id', 'like' '%%')->delete();

Informations sur le constructeur de requête Laravel: https://laravel.com/docs/5.4/queries

12
Rejaul

Je voulais ajouter une autre option pour ceux qui parviennent à ce fil via Google. Je devais accomplir cela, mais je voulais conserver ma valeur d'incrémentation automatique que truncate() réinitialise. Je ne voulais pas non plus utiliser DB:: parce que je voulais utiliser directement l'objet modèle. Donc, je suis allé avec ceci:

Model::whereNotNull('id')->delete();

Il est évident que la colonne doit exister réellement, mais dans un modèle Eloquent standard prêt à l'emploi, la colonne id existe et n'est jamais nulle. Je ne sais pas si c'est le meilleur choix, mais cela fonctionne pour mes besoins.

8
lookitsatravis

Le meilleur moyen d'accomplir cette opération dans Laravel 3 semble être l'utilisation de l'interface Fluent pour tronquer le tableau, comme indiqué ci-dessous

DB::query("TRUNCATE TABLE mytable");
4
Pete

Je n'ai pas pu utiliser Model::truncate() car cela provoquerait une 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 (du moins dans Laravel 5.0):

La méthode non statique Illuminate\Database\Eloquent\Model :: delete () ne doit pas être appelée de manière statique, en supposant que $ this provient d'un contexte incompatible

Mais cela fonctionne:

(new Model)->newQuery()->delete()

Cela supprimera toutes les lignes si vous avez configuré cette option. Pour supprimer complètement toutes les lignes, y compris celles supprimées, vous pouvez modifier ceci:

(new Model)->newQueryWithoutScopes()->forceDelete()
4
Dave James Miller

Vous pouvez également exploiter davantage le pouvoir d’Eloquent en procédant ainsi;

MyModel::get()->each->delete();
3
Mattias Geniar

Vous pouvez essayer cette ligne qui préserve les suppressions douces aussi:

Model::whereRaw('1=1')->delete();
1
jfeid

Dans la même veine que la réponse de Travis Vignon, j'avais besoin des données du modèle éloquent et, si les conditions étaient correctes, je devais soit supprimer, soit mettre à jour le modèle. J'ai finalement obtenu le champ minimum et maximum renvoyé par ma requête (si un autre champ était ajouté à la table et qui répondrait à mes critères de sélection), ainsi que les critères de sélection d'origine permettant de mettre à jour les champs via une requête SQL brute (comme opposé à une requête éloquente par objet de la collection).

Je sais que l’utilisation de SQL brut enfreint la philosophie de code magnifique de Laravels, mais il serait difficile de supporter des centaines de requêtes à la place de celle-ci.

0
Sidney

Solution qui fonctionne 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
Alain Berrier

Peut faire un foreach loop aussi ..

$collection = Model::get();

foreach($collection as $c) {

$c->delete();

}
0
Sam Solomon