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źć!
Odpowiedzi:
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+ .
Model::getQuery()->delete();
Po prostu weź bazowy kreator z nazwą tabeli i zrób cokolwiek. Nie może być bardziej uporządkowany.
Laravel 5,6 rozwiązanie
\App\Model::query()->delete();
Możesz użyć, Model::truncate()
jeśli wyłączysz foreign_key_checks
(zakładam, że używasz MySQL).
DB::statement("SET foreign_key_checks=0");
Model::truncate();
DB::statement("SET foreign_key_checks=1");
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 .
Nie można obciąć tabeli, do której odwołuje się ograniczenie klucza obcego
Więc dobrym pomysłem może być skorzystanie z drugiego.
delete
oczywiście to nie to samo, co truncate
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
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.
Model::delete();
osiągnie to samo.
Model::delete()
rzuca wyjątek Non-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:
SQLSTATE [42000]: Błąd składni lub naruszenie zasad dostępu: 1701 Nie można obciąć tabeli, do której odwołuje się ograniczenie klucza obcego
I niestety Model::delete()
nie działa (przynajmniej w Laravel 5.0):
Metoda niestatyczna Illuminate \ Database \ Eloquent \ Model :: delete () nie powinna być wywoływana statycznie, zakładając $ this z niezgodnego kontekstu
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()
proste rozwiązanie:
Mymodel::query()->delete();
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.
Może zrobić dla każdegopętla też ...
$collection = Model::get();
foreach($collection as $c) {
$c->delete();
}
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]);