Comment faire pour supprimer toutes les lignes d'une table à l'aide Éloquent?
Ma conjecture était d'utiliser la syntaxe suivante:
MyModel::all()->delete();
Mais cela ne fonctionne pas. Je suis sûr que c'est super simple, mais j'ai cherché de la documentation sur le sujet et ne le trouve pas!
Vous devez vous connecter pour publier un commentaire.
La raison
MyModel::all()->delete()
ne fonctionne pas est parce queall()
effectivement déclenche la requête et renvoie une collection de Éloquent objets.Vous pouvez faire usage de la méthode tronquer, cela fonctionne pour Laravel 4 et 5:
Qui supprime toutes les lignes de la table sans se connecter les suppressions de lignes.
MyModel::all()->delete()
, utilisezforeach (MyModel::all() as $e) { $e->delete() }
truncate()
peut échouer lorsque vous avez configuré les clés étrangèresLaravel 5.2+ solution.
Il suffit de saisir sous-jacent builder avec le nom de la table et de faire quoi que ce soit.
Ne pouvait pas être plus propre que cela.
Laravel 5.6 solution
Vous pouvez utiliser
Model::truncate()
si vous désactivezforeign_key_checks
(je suppose que vous utilisez MySQL).J'ai vu les deux méthodes été utilisé dans les graines de fichiers.
Même si vous ne pouvez pas utiliser la première, si vous souhaitez définir clés étrangères.
De sorte qu'il pourrait être une bonne idée d'utiliser la seconde.
delete
n'est évidemment pas le même quetruncate
bien.Il est un moyen indirect:
Exemple:
Laravel générateur de requêtes d'informations: https://laravel.com/docs/5.4/queries
DELETE FROM users WHERE id LIKE '%%'
qui correspond à toutes les lignes dans la table, donc la suppression de 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 arriver à ce fil par l'intermédiaire de Google. J'avais besoin de cela, mais je voulais conserver mon auto-incrément de la valeur qui
truncate()
réinitialise. J'ai aussi ne veux pas utiliserDB::
tout, parce que je voulais le faire fonctionner directement à partir du modèle objet. Donc, je suis allé avec ceci:Évidemment la colonne devra existe réellement, mais dans une norme, out-of-the-box Éloquent modèle, la
id
colonne existe et n'est jamais null. Je ne sais pas si c'est le meilleur choix, mais il travaille pour mes fins.Model::delete();
permettra d'accomplir la même chose.Model::delete()
déclenche une exceptionNon-static method Illuminate\Database\Eloquent\Model::delete() should not be called statically
, au moins dans Laravel 5.0.Je n'étais pas en mesure d'utiliser
Model::truncate()
comme il le ferait d'erreur:Et malheureusement
Model::delete()
ne fonctionne pas (au moins dans Laravel 5.0):Mais ce n'travail:
Qui soft-supprimer toutes les lignes, si vous avez doux-supprimer le jeu jusqu'. De totalement supprimer toutes les lignes, y compris supprimée ceux que vous pouvez changer à cela:
Le meilleur moyen pour la réalisation de cette opération dans
Laravel 3
semble être l'utilisation de laFluent
interface de tronquer le tableau comme indiqué ci-dessousVous pouvez essayer ce one-liner qui préserve soft-supprime également:
Dans une veine similaire à Travis vignon réponse, j'données requises à partir de l'éloquent modèle, et si les conditions étaient correctes, j'avais besoin de supprimer ou de mettre à jour le modèle. J'ai fini par trouver le minimum et le maximum que j'avais du champ retourné par ma requête (dans le cas d'un autre champ a été ajouté à la table qui permettrait de répondre à mes critères de sélection) avec l'original de critères de sélection pour mettre à jour les champs via un cru de requête SQL (par opposition à un éloquent requête par l'objet dans la collection).
Je sais que l'utilisation de SQL brut viole laravels belle code de la philosophie, mais itd être dur pour l'estomac, éventuellement, des centaines de requêtes au lieu d'une seule.
Pouvez faire un foreachde la boucle de trop..
Solution qui fonctionne avec de la Lumière 5.5 avec les contraintes de clés étrangères :
solution simple: