it-swarm.com.de

Wie lösche ich alle Zeilen in einer Tabelle mit Eloquent?

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 finde es nicht!

96
Pete

Der Grund für MyModel::all()->delete() ist, dass all() die Abfrage tatsächlich auslöst und eine Sammlung von eloquenten Objekten zurückgibt. 

Sie können die abgeschnittene Methode verwenden, dies funktioniert für Laravel 4 und 5:

MyModel::truncate();

Dadurch werden alle Zeilen aus der Tabelle gelöscht, ohne dass einzelne Zeilen gelöscht werden.

182
bilalq

Laravel 5.2+ Lösung.

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

Holen Sie sich einfach den zugrundeliegenden Builder mit dem Tabellennamen und tun Sie was auch immer .. Könnte nicht sauberer sein.

Laravel 5.6 Lösung

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

Sie können Model::truncate() verwenden, wenn Sie foreign_key_checks deaktivieren (ich nehme an, Sie verwenden MySQL).

DB::statement("SET foreign_key_checks=0");
Model::truncate();
DB::statement("SET foreign_key_checks=1");
49
Fortex

Ich habe gesehen, dass beide Methoden in Seed-Dateien verwendet wurden.

// Uncomment the below to wipe the table clean before populating

DB::table('table_name')->truncate();

//or

DB::table('table_name')->delete();

Auch wenn Sie den ersten nicht verwenden können, wenn Sie foreign keys setzen möchten.

Eine in einer Fremdschlüsselbedingung referenzierte Tabelle kann nicht abgeschnitten werden

Es ist also eine gute Idee, den zweiten zu verwenden.

24

Es gibt einen indirekten Weg:

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

Beispiel:

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

Informationen zum Laravel Query Builder: https://laravel.com/docs/5.4/queries

12
Rejaul

Ich wollte eine weitere Option für diejenigen hinzufügen, die über Google zu diesem Thread gelangen. Ich musste das erreichen, wollte aber meinen Auto-Inkrement-Wert beibehalten, den truncate() zurücksetzt. Ich wollte auch DB:: nichts verwenden, da ich direkt vom Modellobjekt aus operieren wollte. Also ging ich mit:

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

Offensichtlich muss die Spalte tatsächlich vorhanden sein, aber in einem standardmäßigen Eloquent-Modell ist die Spalte id vorhanden und ist niemals null. Ich weiß nicht, ob dies die beste Wahl ist, aber es funktioniert für meine Zwecke.

8
lookitsatravis

Die beste Möglichkeit, diesen Vorgang in Laravel 3 auszuführen, scheint die Verwendung der Fluent-Schnittstelle zu sein, um die Tabelle wie unten gezeigt abzuschneiden

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

Ich konnte Model::truncate() nicht verwenden, da dies zu einem Fehler führen würde:

SQLSTATE [42000]: Syntaxfehler oder Zugriffsverletzung: 1701 Eine Tabelle, auf die in einer Fremdschlüsseleinschränkung verwiesen wird, kann nicht abgeschnitten werden

Und leider funktioniert Model::delete() nicht (zumindest in Laravel 5.0):

Die nicht statische Methode Illuminate\Database\Eloquent\Model :: delete () sollte nicht statisch aufgerufen werden, sofern $ this aus einem inkompatiblen Kontext besteht

Das funktioniert aber:

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

Das löscht alle Zeilen, wenn Sie Soft-Delete eingerichtet haben. Um alle Zeilen vollständig zu löschen, einschließlich der von Soft-Delete gelöschten, können Sie Folgendes ändern:

(new Model)->newQueryWithoutScopes()->forceDelete()
4

Sie können die Macht von Eloquent auch weiter nutzen, indem Sie dies tun;

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

Sie können diesen One-Liner ausprobieren, der Soft-Delet-Dateien auch bewahrt:

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

In einer ähnlichen Weise wie Travis Vignons Antwort verlangte ich Daten aus dem eloquenten Modell, und wenn die Bedingungen richtig waren, musste ich das Modell entweder löschen oder aktualisieren. Ich habe schließlich das Minimum und Maximum erhalten, das von meiner Abfrage zurückgegeben wurde (falls ein anderes Feld zu der Tabelle hinzugefügt würde, das meine Auswahlkriterien erfüllte), zusammen mit den ursprünglichen Auswahlkriterien, um die Felder über eine SQL-Abfrage (als einer eloquenten Abfrage pro Objekt in der Sammlung entgegen.).

Ich weiß, dass die Verwendung von rohem SQL gegen die schöne Codephilosophie von Laravels verstößt, aber es wäre schwer, möglicherweise Hunderte von Abfragen anstelle von einer Frage zu ertragen.

0
Sidney

Lösung, die mit Lumen 5.5 mit Fremdschlüsseleinschränkungen arbeitet:

$categories = MusicCategory::all();
foreach($categories as $category)
{
$category->delete();

}
return response()->json(['error' => false]);
0
Alain Berrier

Kann auch eine foreach loop machen ..

$collection = Model::get();

foreach($collection as $c) {

$c->delete();

}
0
Sam Solomon