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!
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.
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();
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");
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.
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
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.
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");
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()
Vous pouvez également exploiter davantage le pouvoir d’Eloquent en procédant ainsi;
MyModel::get()->each->delete();
Vous pouvez essayer cette ligne qui préserve les suppressions douces aussi:
Model::whereRaw('1=1')->delete();
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.
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]);
Peut faire un foreach loop aussi ..
$collection = Model::get();
foreach($collection as $c) {
$c->delete();
}