Réponses:
La raison MyModel::all()->delete()
ne fonctionne pas parce all()
que déclenche en fait la requête et renvoie une collection d'objets Eloquent.
Vous pouvez utiliser la méthode truncate, cela fonctionne pour Laravel 4 et 5:
MyModel::truncate();
Cela supprime toutes les lignes de la table sans enregistrer les suppressions de lignes individuelles.
MyModel::all()->delete()
, utilisezforeach (MyModel::all() as $e) { $e->delete() }
Solution Laravel 5.2+ .
Model::getQuery()->delete();
Saisissez simplement le générateur sous-jacent avec le nom de la table et faites ce que vous voulez. Ça ne pourrait pas être plus ordonné que ça.
Solution Laravel 5.6
\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 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 le premier si vous souhaitez définir des clés étrangères .
Impossible de tronquer une table référencée dans une contrainte de clé étrangère
Il peut donc être judicieux d'utiliser le second.
delete
ce n'est évidemment pas la même chose truncate
.
Il existe un moyen indirect:
myModel:where('anyColumnName', 'like', '%%')->delete();
Exemple:
User:where('id', 'like' '%%')->delete();
Informations sur le générateur de requêtes Laravel: https://laravel.com/docs/5.4/queries
DELETE FROM users WHERE id LIKE '%%'
qui correspond à toutes les lignes de la table, supprimant ainsi tout.
whereIn
méthode: $itemsAllContentIDs = Item::where('user_id', $userId)->pluck('item_content_id')->all();
ItemsContent::whereIn('id', $itemsAllContentIDs)->delete();
Je voulais ajouter une autre option pour ceux qui accèdent à ce fil via Google. J'avais besoin d'accomplir cela, mais je voulais conserver ma valeur d'incrémentation automatique qui se truncate()
réinitialise. Je ne voulais pas non plus utiliser DB::
quoi que ce soit parce que je voulais opérer directement à partir de l'objet modèle. Alors, je suis allé avec ceci:
Model::whereNotNull('id')->delete();
Évidemment, la colonne devra réellement exister, mais dans un modèle Eloquent standard, prêt à l'emploi, la id
colonne existe et n'est jamais nulle. Je ne sais pas si c'est le meilleur choix, mais cela fonctionne pour mes besoins.
Model::delete();
accomplira la même chose.
Model::delete()
lance une exception Non-static method Illuminate\Database\Eloquent\Model::delete() should not be called statically
, du moins dans Laravel 5.0.
Je n'ai pas pu utiliser Model::truncate()
car cela ferait 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 statiquement, en supposant $ this à partir d'un contexte incompatible
Mais cela fonctionne:
(new Model)->newQuery()->delete()
Cela supprimera toutes les lignes, si vous avez configuré la suppression réversible. Pour supprimer complètement toutes les lignes, y compris celles supprimées de manière réversible, vous pouvez changer comme suit:
(new Model)->newQueryWithoutScopes()->forceDelete()
solution simple:
Mymodel::query()->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 supprimer ou mettre à jour le modèle. J'ai fini par obtenir le champ minimum et maximum que j'avais renvoyé par ma requête (au cas où un autre champ serait ajouté à la table qui répondrait à mes critères de sélection) ainsi que les critères de sélection d'origine pour mettre à jour les champs via une requête SQL brute (comme par opposition à une requête éloquente par objet de la collection).
Je sais que l'utilisation de SQL brut viole la belle philosophie de code de laravels, mais il serait difficile de gérer des centaines de requêtes à la place d'une seule.
Peut faire un pour chaqueboucle aussi ..
$collection = Model::get();
foreach($collection as $c) {
$c->delete();
}
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]);