Przypuszczałem, że użyję następującej składni:
MyModel::all()->delete();
Ale to nie zadziałało. Jestem pewien, że to super proste, ale szukałem dokumentacji na ten temat i nie mogę jej znaleźć!
Przyczyna MyModel::all()->delete()
nie działa, ponieważ w all()
rzeczywistości odpala zapytanie i zwraca kolekcję obiektów elokwentnych.
Możesz skorzystać z metody obcięcia, która działa dla Laravel 4 i 5:
MyModel::truncate();
Spowoduje to usunięcie wszystkich wierszy z tabeli bez rejestrowania usunięcia pojedynczych wierszy.
MyModel::all()->delete()
, użyjforeach (MyModel::all() as $e) { $e->delete() }
Rozwiązanie Laravel 5.2+ .
Po prostu weź bazowy kreator z nazwą tabeli i zrób cokolwiek. Nie może być bardziej uporządkowany.
Laravel 5,6 rozwiązanie
źródło
Możesz użyć,
Model::truncate()
jeśli wyłączyszforeign_key_checks
(zakładam, że używasz MySQL).DB::statement("SET foreign_key_checks=0"); Model::truncate(); DB::statement("SET foreign_key_checks=1");
źródło
Widziałem obie metody używane w plikach seed.
// Uncomment the below to wipe the table clean before populating DB::table('table_name')->truncate(); //or DB::table('table_name')->delete();
Nawet jeśli nie możesz użyć pierwszego, jeśli chcesz ustawić klucze obce .
Więc dobrym pomysłem może być skorzystanie z drugiego.
źródło
delete
oczywiście to nie to samo, cotruncate
jednak.Istnieje sposób pośredni:
myModel:where('anyColumnName', 'like', '%%')->delete();
Przykład:
User:where('id', 'like' '%%')->delete();
Informacje o narzędziu do tworzenia zapytań Laravel: https://laravel.com/docs/5.4/queries
źródło
DELETE FROM users WHERE id LIKE '%%'
który dopasowuje wszystkie wiersze w tabeli, usuwając w ten sposób wszystko.whereIn
metody:$itemsAllContentIDs = Item::where('user_id', $userId)->pluck('item_content_id')->all();
ItemsContent::whereIn('id', $itemsAllContentIDs)->delete();
Chciałem dodać kolejną opcję dla tych, którzy dostają się do tego wątku przez Google. Musiałem to zrobić, ale chciałem zachować moją wartość automatycznego zwiększania, która jest
truncate()
resetowana. Nie chciałem teżDB::
niczego używać , ponieważ chciałem działać bezpośrednio na obiekcie modelu. Więc poszedłem z tym:Model::whereNotNull('id')->delete();
Oczywiście kolumna będzie musiała faktycznie istnieć, ale w standardowym, nieszablonowym modelu elokwentnym
id
kolumna istnieje i nigdy nie jest pusta. Nie wiem, czy to najlepszy wybór, ale działa na moje potrzeby.źródło
Model::delete();
osiągnie to samo.Model::delete()
rzuca wyjątekNon-static method Illuminate\Database\Eloquent\Model::delete() should not be called statically
, przynajmniej w Laravel 5.0.Nie mogłem użyć,
Model::truncate()
ponieważ spowodowałoby to błąd:I niestety
Model::delete()
nie działa (przynajmniej w Laravel 5.0):Ale to działa:
(new Model)->newQuery()->delete()
Spowoduje to nietrwałe usunięcie wszystkich wierszy, jeśli skonfigurowano usuwanie nietrwałe. Aby całkowicie usunąć wszystkie wiersze, w tym usunięte nietrwale, możesz zmienić to:
(new Model)->newQueryWithoutScopes()->forceDelete()
źródło
Wydaje się, że najlepszym sposobem wykonania tej operacji w programie
Laravel 3
jest użycieFluent
interfejsu do obcięcia tabeli, jak pokazano poniżejDB::query("TRUNCATE TABLE mytable");
źródło
Możesz wypróbować tę jedną linijkę, która zachowuje również miękkie usuwanie:
Model::whereRaw('1=1')->delete();
źródło
proste rozwiązanie:
źródło
Podobnie jak w przypadku odpowiedzi Travisa Vignona, zażądałem danych z wymownego modelu i jeśli warunki były prawidłowe, musiałem albo usunąć, albo zaktualizować model. Skończyło się na tym, że otrzymałem minimalne i maksymalne pole zwrócone przez moje zapytanie (na wypadek, gdyby do tabeli dodano inne pole, które spełniałoby moje kryteria wyboru) wraz z pierwotnymi kryteriami wyboru, aby zaktualizować pola za pomocą jednego surowego zapytania SQL (jak w przeciwieństwie do jednego wymownego zapytania na obiekt w kolekcji).
Wiem, że użycie surowego SQL narusza filozofię pięknego kodu Laravels, ale trudno byłoby znieść setki zapytań zamiast jednego.
źródło
Może zrobić dla każdegopętla też ...
$collection = Model::get(); foreach($collection as $c) { $c->delete(); }
źródło
Rozwiązanie współpracujące z Lumenem 5.5 z ograniczeniami kluczy obcych:
$categories = MusicCategory::all(); foreach($categories as $category) { $category->delete(); } return response()->json(['error' => false]);
źródło