Meine Vermutung war, die folgende Syntax zu verwenden:
MyModel::all()->delete();
Das hat aber nicht funktioniert. Ich bin sicher, es ist super einfach, aber ich habe nach Dokumentation zu diesem Thema gesucht und kann sie nicht finden!
Der Grund MyModel::all()->delete()
dafür ist, dass all()
die Abfrage tatsächlich ausgelöst wird und eine Sammlung eloquenter Objekte zurückgegeben wird.
Sie können die Methode "Abschneiden" verwenden. Dies funktioniert für Laravel 4 und 5:
MyModel::truncate();
Dadurch werden alle Zeilen aus der Tabelle entfernt, ohne dass einzelne Zeilenlöschungen protokolliert werden.
MyModel::all()->delete()
, verwenden Sieforeach (MyModel::all() as $e) { $e->delete() }
Laravel 5.2+ Lösung.
Nehmen Sie einfach den zugrunde liegenden Builder mit dem Tabellennamen und machen Sie was auch immer. Könnte nicht aufgeräumter sein.
Laravel 5.6 Lösung
quelle
Sie können verwenden,
Model::truncate()
wenn Sie deaktivierenforeign_key_checks
(ich nehme an, Sie verwenden MySQL).quelle
Ich habe gesehen, dass beide Methoden in Seed-Dateien verwendet wurden.
Auch wenn Sie den ersten nicht verwenden können, wenn Sie Fremdschlüssel festlegen möchten .
Es könnte also eine gute Idee sein, die zweite zu verwenden.
quelle
delete
ist offensichtlich nicht dasselbe wie alstruncate
ob.Es gibt einen indirekten Weg:
Beispiel:
Informationen zum Builder für Laravel-Abfragen: https://laravel.com/docs/5.4/queries
quelle
DELETE FROM users WHERE id LIKE '%%'
die mit allen Zeilen in der Tabelle übereinstimmt, und löscht so alles.whereIn
Methode aus meinem Modell zu löschen :$itemsAllContentIDs = Item::where('user_id', $userId)->pluck('item_content_id')->all();
ItemsContent::whereIn('id', $itemsAllContentIDs)->delete();
Ich wollte eine weitere Option für diejenigen hinzufügen, die über Google zu diesem Thread gelangen. Ich musste dies erreichen, wollte aber meinen Auto-Inkrement-Wert beibehalten, der
truncate()
zurückgesetzt wird. Ich wollte auchDB::
nichts verwenden , weil ich direkt vom Modellobjekt aus arbeiten wollte. Also ging ich damit:Natürlich muss die Spalte tatsächlich vorhanden sein, aber in einem standardmäßigen, sofort einsatzbereiten eloquenten Modell ist die
id
Spalte vorhanden und niemals null. Ich weiß nicht, ob dies die beste Wahl ist, aber es funktioniert für meine Zwecke.quelle
Model::delete();
wird das gleiche erreichen.Model::delete()
Wirft leider eine AusnahmeNon-static method Illuminate\Database\Eloquent\Model::delete() should not be called statically
, zumindest in Laravel 5.0.Ich konnte nicht verwenden,
Model::truncate()
da es Fehler wäre:Und
Model::delete()
funktioniert leider nicht (zumindest in Laravel 5.0):Aber das funktioniert:
Dadurch werden alle Zeilen sanft gelöscht, wenn Sie das Soft-Löschen eingerichtet haben. Um alle Zeilen vollständig zu löschen, einschließlich der weich gelöschten, können Sie Folgendes ändern:
quelle
Der beste Weg, um diesen Vorgang
Laravel 3
auszuführen, scheint die Verwendung derFluent
Schnittstelle zum Abschneiden der Tabelle zu sein, wie unten gezeigtquelle
Sie können diesen Einzeiler ausprobieren, der auch weiche Löschvorgänge bewahrt:
quelle
einfache Lösung:
quelle
Ähnlich wie bei Travis Vignons Antwort benötigte ich Daten aus dem beredten Modell, und wenn die Bedingungen korrekt waren, musste ich das Modell entweder löschen oder aktualisieren. Am Ende erhielt ich das von meiner Abfrage zurückgegebene Minimum und Maximum (falls ein anderes Feld zur Tabelle hinzugefügt wurde, das meinen Auswahlkriterien entspricht) zusammen mit den ursprünglichen Auswahlkriterien, um die Felder über eine unformatierte SQL-Abfrage (as) zu aktualisieren im Gegensatz zu einer beredten Abfrage pro Objekt in der Sammlung).
Ich weiß, dass die Verwendung von rohem SQL gegen die schöne Code-Philosophie von Laravel verstößt, aber es wäre schwierig, möglicherweise Hunderte von Abfragen anstelle einer zu ertragen.
quelle
Kann ein für jedesSchleife auch ..
quelle
Lösung, die mit Lumen 5.5 mit Fremdschlüsseleinschränkungen arbeitet:
quelle