我的猜测是使用以下语法:
MyModel::all()->delete();
但是那行不通。我确定这很简单,但我已经搜索了相关文档,找不到答案!
MyModel::all()->delete()
不能生效是因为all()
实际上会触发查询并返回一个Eloquent对象的集合。
您可以使用truncate方法,这适用于Laravel 4和5:
MyModel::truncate();
删除整个表中所有行,而不记录单独的行删除。
MyModel::all()->delete()
,请使用 foreach (MyModel::all() as $e) { $e->delete() }
。 - Ema4rltruncate()
可能会失败。 - AdamLaravel 5.2+的解决方案。
Model::getQuery()->delete();
只需获取带有表名的基本构建器并进行任何操作,这比其他方法更简洁。
Laravel 5.6 解决方案
\App\Model::query()->delete();
如果您禁用了foreign_key_checks
(我假设您使用的是MySQL),则可以使用 Model::truncate()
。
DB::statement("SET foreign_key_checks=0");
Model::truncate();
DB::statement("SET foreign_key_checks=1");
我已经看到种子文件中这两种方法都被使用过。
// Uncomment the below to wipe the table clean before populating
DB::table('table_name')->truncate();
//or
DB::table('table_name')->delete();
即使您想设置外键,第一个选项也不能使用。
无法截断引用了外键约束的表
因此,使用第二个选项可能是一个好主意。
我想为通过谷歌搜索进入此帖子的用户添加另一种选项。我需要完成这个操作,但是希望保留我的自动递增值,而truncate()
会重置它。我也不想使用任何DB::
,因为我希望直接对模型对象进行操作。所以,我选择了这个:
Model::whereNotNull('id')->delete();
显然该列必须确实存在,但在一个标准的、开箱即用的Eloquent模型中,id
列存在且从未为null。我不确定这是否是最佳选择,但对于我的目的来说它是有效的。
Model::delete();
将完成相同的事情。 - LengModel::delete()
会抛出异常:Non-static method Illuminate\Database\Eloquent\Model::delete() should not be called statically
。 - Dave James Miller简单解决方案:
Mymodel::query()->delete();
query()->forceDelete()
。 - ibnɘꟻ有一种间接的方法:
myModel:where('anyColumnName', 'like', '%%')->delete();
示例:
User:where('id', 'like' '%%')->delete();
Laravel查询构建器信息:https://laravel.com/docs/5.4/queries
DELETE FROM users WHERE id LIKE '%%'
,它匹配表中的所有行,因此删除了所有内容。 - HkanwhereIn
方法从我的模型中删除所有记录:$itemsAllContentIDs = Item::where('user_id', $userId)->pluck('item_content_id')->all();
ItemsContent::whereIn('id', $itemsAllContentIDs)->delete();
- Keith DC我无法使用Model::truncate()
,因为会出现错误:
SQLSTATE[42000]: 语法错误或访问冲突: 1701 不允许截断一个被外键约束引用的表
不幸的是,Model::delete()
也不起作用(至少在Laravel 5.0中):
非静态方法Illuminate\Database\Eloquent\Model::delete()不应从不兼容的上下文调用,假设$this
但这个可以工作:
(new Model)->newQuery()->delete()
如果您已经设置了软删除,那么这将软删除所有行。要完全删除所有行,包括软删除的行,您可以改为使用以下内容:
(new Model)->newQueryWithoutScopes()->forceDelete()
Model::whereRaw('1=1')->delete();
truncate
存在的问题是它暗示了立即提交操作,所以如果在一个事务中使用它,则有可能会发现表为空。最好的解决方案是使用delete
。
MyModel::query()->delete();