Yanıtlar:
Nedeni MyModel::all()->delete()
işe yaramıyor çünkü all()
aslında sorguyu ateşliyor ve bir Eloquent nesneleri koleksiyonu döndürüyor.
Kesik yöntemini kullanabilirsiniz, bu Laravel 4 ve 5 için çalışır:
MyModel::truncate();
Bu, tek tek satır silme işlemlerini günlüğe kaydetmeden tablodaki tüm satırları bırakır.
MyModel::all()->delete()
, şunu kullanınforeach (MyModel::all() as $e) { $e->delete() }
Laravel 5.2+ çözümü.
Model::getQuery()->delete();
Sadece altta yatan oluşturucuyu tablo adıyla alın ve her şeyi yapın. Bundan daha düzenli olamaz.
Laravel 5.6 çözümü
\App\Model::query()->delete();
Sen kullanabilirsiniz Model::truncate()
devre dışı eğer foreign_key_checks
(ben MySQL kullanmak farz).
DB::statement("SET foreign_key_checks=0");
Model::truncate();
DB::statement("SET foreign_key_checks=1");
Her iki yöntemin de tohum dosyalarında kullanıldığını gördüm.
// Uncomment the below to wipe the table clean before populating
DB::table('table_name')->truncate();
//or
DB::table('table_name')->delete();
Yabancı anahtarlar ayarlamak istiyorsanız ilkini kullanamasanız bile .
Yabancı anahtar kısıtlamasında referans verilen bir tablo kesilemez
Bu yüzden ikincisini kullanmak iyi bir fikir olabilir.
delete
açıkçası truncate
sanki aynı değil .
Dolaylı bir yol var:
myModel:where('anyColumnName', 'like', '%%')->delete();
Misal:
User:where('id', 'like' '%%')->delete();
Laravel sorgu oluşturucu bilgileri: https://laravel.com/docs/5.4/queries
DELETE FROM users WHERE id LIKE '%%'
, tablodaki tüm satırlarla eşleşen SQL'i çalıştırır ve böylece her şeyi siler.
whereIn
yöntemi kullanarak kullandım : $itemsAllContentIDs = Item::where('user_id', $userId)->pluck('item_content_id')->all();
ItemsContent::whereIn('id', $itemsAllContentIDs)->delete();
Bu konuya Google aracılığıyla ulaşanlar için başka bir seçenek eklemek istedim. Bunu başarmam gerekiyordu, ancak truncate()
sıfırlanan otomatik artış değerimi korumak istedim . Ayrıca, DB::
doğrudan model nesnesinin dışında çalışmak istediğim için hiçbir şey kullanmak istemedim . Ben de bununla gittim:
Model::whereNotNull('id')->delete();
Açıktır ki sütunun gerçekten var olması gerekecek, ancak standart, kullanıma hazır Eloquent modelinde id
sütun var ve hiçbir zaman boş değil. Bunun en iyi seçenek olup olmadığını bilmiyorum ama amaçlarım için işe yarıyor.
Model::delete();
aynı şeyi başaracak.
Model::delete()
bir istisna atıyor Non-static method Illuminate\Database\Eloquent\Model::delete() should not be called statically
.
Model::truncate()
Hata oluşturacağı için kullanamadım :
SQLSTATE [42000]: Sözdizimi hatası veya erişim ihlali: 1701 Yabancı anahtar kısıtlamasında başvurulan bir tablo kesilemez
Ve maalesef Model::delete()
çalışmıyor (en azından Laravel 5.0'da):
Statik olmayan yöntem Illuminate \ Database \ Eloquent \ Model :: delete (), $ this'in uyumsuz bağlamdan olduğu varsayılarak statik olarak çağrılmamalıdır
Ama bu işe yarıyor:
(new Model)->newQuery()->delete()
Yazılımla silme ayarınız varsa, bu tüm satırları yazılımla silecektir. Yazılımla silinenler dahil tüm satırları tamamen silmek için şuna değiştirebilirsiniz:
(new Model)->newQueryWithoutScopes()->forceDelete()
basit çözüm:
Mymodel::query()->delete();
Travis vignon'un cevabına benzer bir şekilde, anlamlı modelden veri istedim ve koşullar doğruysa, modeli silmem veya güncellemem gerekiyordu. Sorgum tarafından döndürülen minimum ve maksimum I alanını (seçim kriterlerimi karşılayacak başka bir alan eklenmesi durumunda) ve alanları bir ham SQL sorgusu ( koleksiyondaki nesne başına bir anlamlı sorguya karşılık).
Ham SQL kullanımının Laravel'in güzel kod felsefesini ihlal ettiğini biliyorum, ancak muhtemelen yüzlerce sorguyu bir yerine sindirmek zor olacaktır.
Yapabilir her biri içindöngü de ..
$collection = Model::get();
foreach($collection as $c) {
$c->delete();
}
Yabancı anahtar kısıtlamalarıyla Lumen 5.5 ile çalışan çözüm:
$categories = MusicCategory::all();
foreach($categories as $category)
{
$category->delete();
}
return response()->json(['error' => false]);