Antworten:
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.
Model::getQuery()->delete();
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
\App\Model::query()->delete();
Sie können verwenden, Model::truncate()
wenn Sie deaktivieren foreign_key_checks
(ich nehme an, Sie verwenden MySQL).
DB::statement("SET foreign_key_checks=0");
Model::truncate();
DB::statement("SET foreign_key_checks=1");
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 Fremdschlüssel festlegen möchten .
Eine Tabelle, auf die in einer Fremdschlüsseleinschränkung verwiesen wird, kann nicht abgeschnitten werden
Es könnte also eine gute Idee sein, die zweite zu verwenden.
delete
ist offensichtlich nicht dasselbe wie als truncate
ob.
Es gibt einen indirekten Weg:
myModel:where('anyColumnName', 'like', '%%')->delete();
Beispiel:
User:where('id', 'like' '%%')->delete();
Informationen zum Builder für Laravel-Abfragen: https://laravel.com/docs/5.4/queries
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 auch DB::
nichts verwenden , weil ich direkt vom Modellobjekt aus arbeiten wollte. Also ging ich damit:
Model::whereNotNull('id')->delete();
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.
Model::delete();
wird das gleiche erreichen.
Model::delete()
Wirft leider eine Ausnahme Non-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:
SQLSTATE [42000]: Syntaxfehler oder Zugriffsverletzung: 1701 Eine Tabelle, auf die in einer Fremdschlüsseleinschränkung verwiesen wird, kann nicht abgeschnitten werden
Und Model::delete()
funktioniert leider nicht (zumindest in Laravel 5.0):
Nicht statische Methode Illuminate \ Database \ Eloquent \ Model :: delete () sollte nicht statisch aufgerufen werden, vorausgesetzt, dies ist aus einem inkompatiblen Kontext
Aber das funktioniert:
(new Model)->newQuery()->delete()
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:
(new Model)->newQueryWithoutScopes()->forceDelete()
einfache Lösung:
Mymodel::query()->delete();
Ä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.
Kann ein für jedesSchleife auch ..
$collection = Model::get();
foreach($collection as $c) {
$c->delete();
}
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]);