Jawaban:
Alasannya MyModel::all()->delete()
tidak berhasil adalah karena all()
sebenarnya memadamkan kueri dan mengembalikan koleksi objek Eloquent.
Anda dapat menggunakan metode truncate, ini berfungsi untuk Laravel 4 dan 5:
MyModel::truncate();
Itu menjatuhkan semua baris dari tabel tanpa mencatat penghapusan baris individu.
MyModel::all()->delete()
, gunakanforeach (MyModel::all() as $e) { $e->delete() }
Solusi Laravel 5.2+ .
Model::getQuery()->delete();
Hanya ambil pembangun yang mendasari dengan nama tabel dan lakukan apa pun. Tidak bisa lebih rapi dari itu.
Laravel 5.6 solusi
\App\Model::query()->delete();
Anda dapat menggunakan Model::truncate()
jika Anda menonaktifkan foreign_key_checks
(saya berasumsi Anda menggunakan MySQL).
DB::statement("SET foreign_key_checks=0");
Model::truncate();
DB::statement("SET foreign_key_checks=1");
Saya telah melihat kedua metode telah digunakan dalam file seed.
// Uncomment the below to wipe the table clean before populating
DB::table('table_name')->truncate();
//or
DB::table('table_name')->delete();
Meskipun Anda tidak dapat menggunakan yang pertama jika Anda ingin mengatur kunci asing .
Tidak dapat memotong tabel yang dirujuk dalam batasan kunci asing
Jadi mungkin ide yang baik untuk menggunakan yang kedua.
delete
jelas tidak sama dengan itu truncate
.
Ada cara tidak langsung:
myModel:where('anyColumnName', 'like', '%%')->delete();
Contoh:
User:where('id', 'like' '%%')->delete();
Informasi pembuat kueri laravel: https://laravel.com/docs/5.4/queries
DELETE FROM users WHERE id LIKE '%%'
yang cocok dengan semua baris dalam tabel, sehingga menghapus semuanya.
whereIn
metode: $itemsAllContentIDs = Item::where('user_id', $userId)->pluck('item_content_id')->all();
ItemsContent::whereIn('id', $itemsAllContentIDs)->delete();
Saya ingin menambahkan opsi lain untuk mereka yang mendapatkan utas ini melalui Google. Saya perlu melakukan ini, tetapi ingin mempertahankan nilai kenaikan otomatis yang truncate()
diatur ulang. Saya juga tidak ingin menggunakan DB::
apa pun karena saya ingin beroperasi langsung dari objek model. Jadi, saya pergi dengan ini:
Model::whereNotNull('id')->delete();
Jelas kolom harus benar-benar ada, tetapi dalam model Eloquent out-of-the-box standar, id
kolom ada dan tidak pernah nol. Saya tidak tahu apakah ini pilihan terbaik, tetapi ini berfungsi untuk tujuan saya.
Model::delete();
akan mencapai hal yang sama.
Model::delete()
melempar pengecualian Non-static method Illuminate\Database\Eloquent\Model::delete() should not be called statically
, setidaknya di Laravel 5.0.
Saya tidak dapat menggunakan Model::truncate()
karena itu akan kesalahan:
SQLSTATE [42000]: Kesalahan sintaksis atau pelanggaran akses: 1701 Tidak dapat memotong tabel yang dirujuk dalam batasan kunci asing
Dan sayangnya Model::delete()
tidak berfungsi (setidaknya di Laravel 5.0):
Metode non-statis Illuminate \ Database \ Eloquent \ Model :: delete () tidak boleh dipanggil secara statis, dengan asumsi $ this dari konteks yang tidak kompatibel
Tetapi ini berhasil:
(new Model)->newQuery()->delete()
Itu akan menghapus semua baris secara lunak, jika Anda memiliki pengaturan penghapusan-lunak. Untuk sepenuhnya menghapus semua baris termasuk yang terhapus dengan lembut, Anda dapat mengubahnya menjadi ini:
(new Model)->newQueryWithoutScopes()->forceDelete()
solusi sederhana:
Mymodel::query()->delete();
Dalam nada yang mirip dengan jawaban Travis vignon, saya memerlukan data dari model fasih, dan jika kondisinya benar, saya harus menghapus atau memperbarui model. Saya akhirnya mendapatkan bidang minimum dan maksimum saya akan dikembalikan oleh permintaan saya (kalau-kalau bidang lain ditambahkan ke tabel yang akan memenuhi kriteria pilihan saya) bersama dengan kriteria seleksi asli untuk memperbarui bidang melalui satu permintaan SQL mentah (seperti menentang satu kueri fasih per objek dalam koleksi).
Saya tahu penggunaan SQL mentah melanggar filosofi kode indah laravel, tapi itu akan sulit untuk mencerna ratusan pertanyaan di tempat satu.
Bisa melakukan a untuk setiaplingkaran juga ..
$collection = Model::get();
foreach($collection as $c) {
$c->delete();
}
Solusi yang bekerja dengan Lumen 5.5 dengan batasan kunci asing:
$categories = MusicCategory::all();
foreach($categories as $category)
{
$category->delete();
}
return response()->json(['error' => false]);