Câu trả lời:
Lý do MyModel::all()->delete()
không hoạt động là vì all()
thực sự bắn ra truy vấn và trả về một bộ sưu tập các đối tượng Eloquent.
Bạn có thể sử dụng phương pháp cắt ngắn, phương pháp này hoạt động cho Laravel 4 và 5:
MyModel::truncate();
Điều đó làm giảm tất cả các hàng từ bảng mà không ghi nhật ký xóa từng hàng.
MyModel::all()->delete()
, hãy sử dụngforeach (MyModel::all() as $e) { $e->delete() }
Dung dịch Laravel 5.2+ .
Model::getQuery()->delete();
Chỉ cần lấy trình xây dựng cơ bản với tên bảng và làm bất cứ điều gì. Không thể nào gọn gàng hơn thế.
Laravel 5,6 giải pháp
\App\Model::query()->delete();
Bạn có thể sử dụng Model::truncate()
nếu bạn tắt foreign_key_checks
(tôi giả sử bạn sử dụng MySQL).
DB::statement("SET foreign_key_checks=0");
Model::truncate();
DB::statement("SET foreign_key_checks=1");
Tôi đã thấy cả hai phương pháp đã được sử dụng trong các tập tin hạt giống.
// Uncomment the below to wipe the table clean before populating
DB::table('table_name')->truncate();
//or
DB::table('table_name')->delete();
Mặc dù bạn không thể sử dụng khóa đầu tiên nếu bạn muốn đặt khóa ngoại .
Không thể cắt một bảng được tham chiếu trong một ràng buộc khóa ngoại
Vì vậy, nó có thể là một ý tưởng tốt để sử dụng cái thứ hai.
delete
rõ ràng là không giống như truncate
mặc dù.
Có một cách gián tiếp:
myModel:where('anyColumnName', 'like', '%%')->delete();
Thí dụ:
User:where('id', 'like' '%%')->delete();
Thông tin về trình tạo truy vấn của Laravel: https://laravel.com/docs/5.4/queries
DELETE FROM users WHERE id LIKE '%%'
khớp với tất cả các hàng trong bảng, do đó xóa mọi thứ.
whereIn
phương thức: $itemsAllContentIDs = Item::where('user_id', $userId)->pluck('item_content_id')->all();
ItemsContent::whereIn('id', $itemsAllContentIDs)->delete();
Tôi muốn thêm một tùy chọn khác cho những người nhận được chủ đề này thông qua Google. Tôi cần phải thực hiện điều này, nhưng muốn giữ lại giá trị tăng tự động của mình mà truncate()
đặt lại. Tôi cũng không muốn sử dụng DB::
bất cứ thứ gì vì tôi muốn thao tác trực tiếp với đối tượng mô hình. Vì vậy, tôi đã đi với điều này:
Model::whereNotNull('id')->delete();
Rõ ràng là cột sẽ phải thực sự tồn tại, nhưng trong một mô hình Eloquent tiêu chuẩn, vượt trội, id
cột tồn tại và không bao giờ là null. Tôi không biết nếu đây là sự lựa chọn tốt nhất, nhưng nó hoạt động cho mục đích của tôi.
Model::delete();
sẽ hoàn thành điều tương tự.
Model::delete()
ném một ngoại lệ Non-static method Illuminate\Database\Eloquent\Model::delete() should not be called statically
, ít nhất là trong Laravel 5.0.
Tôi không thể sử dụng Model::truncate()
vì nó sẽ bị lỗi:
SQLSTATE [42000]: Lỗi cú pháp hoặc vi phạm truy cập: 1701 Không thể cắt một bảng được tham chiếu trong một ràng buộc khóa ngoài
Và thật không may Model::delete()
, không hoạt động (ít nhất là trong Laravel 5.0):
Phương thức không tĩnh Illuminate \ Database \ Eloquent \ Model :: xóa () không nên được gọi là tĩnh, giả sử $ này từ ngữ cảnh không tương thích
Nhưng điều này không hoạt động:
(new Model)->newQuery()->delete()
Điều đó sẽ xóa mềm tất cả các hàng, nếu bạn đã thiết lập xóa mềm. Để xóa hoàn toàn tất cả các hàng, kể cả các hàng bị xóa mềm, bạn có thể thay đổi thành:
(new Model)->newQueryWithoutScopes()->forceDelete()
giải pháp đơn giản:
Mymodel::query()->delete();
Theo cách tương tự với câu trả lời của Travis vignon, tôi đã yêu cầu dữ liệu từ mô hình hùng hồn và nếu điều kiện là chính xác, tôi cần phải xóa hoặc cập nhật mô hình. Tôi cố gắng nhận được trường tối thiểu và tối đa mà tôi đã trả về bởi truy vấn của mình (trong trường hợp một trường khác được thêm vào bảng đáp ứng tiêu chí lựa chọn của tôi) cùng với tiêu chí lựa chọn ban đầu để cập nhật các trường thông qua một truy vấn SQL thô (như trái ngược với một truy vấn hùng hồn cho mỗi đối tượng trong bộ sưu tập).
Tôi biết việc sử dụng SQL thô vi phạm triết lý mã đẹp, nhưng khó có thể kiểm tra được hàng trăm truy vấn thay cho một truy vấn.
Có thể làm một cho mỗivòng lặp quá ..
$collection = Model::get();
foreach($collection as $c) {
$c->delete();
}
Giải pháp làm việc với Lumen 5.5 với các ràng buộc khóa ngoài:
$categories = MusicCategory::all();
foreach($categories as $category)
{
$category->delete();
}
return response()->json(['error' => false]);