Answers:
原因MyModel::all()->delete()
不起作用是因为all()
实际上触发了查询并返回了Eloquent对象的集合。
您可以使用truncate方法,这适用于Laravel 4和5:
MyModel::truncate();
这将删除表中的所有行,而无需记录单个行的删除。
MyModel::all()->delete()
,请使用foreach (MyModel::all() as $e) { $e->delete() }
Laravel 5.2+解决方案。
Model::getQuery()->delete();
只需获取具有表名的基础构建器,然后执行任何操作即可。没有比这更整齐的了。
Laravel 5.6解决方案
\App\Model::query()->delete();
您可以使用Model::truncate()
是否禁用foreign_key_checks
(我假设您使用MySQL)。
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();
即使要设置外键也不能使用第一个。
无法截断外键约束中引用的表
因此,使用第二个可能是一个好主意。
delete
显然是不一样的truncate
。
有一种间接方式:
myModel:where('anyColumnName', 'like', '%%')->delete();
例:
User:where('id', 'like' '%%')->delete();
Laravel查询构建器信息:https ://laravel.com/docs/5.4/queries
DELETE FROM users WHERE id LIKE '%%'
与表中所有行匹配的SQL ,从而删除所有内容。
whereIn
方法从我的模型中删除所有记录: $itemsAllContentIDs = Item::where('user_id', $userId)->pluck('item_content_id')->all();
ItemsContent::whereIn('id', $itemsAllContentIDs)->delete();
我想为那些通过Google进入该话题的人添加另一个选择。我需要完成此操作,但想保留自动truncate()
重置的值。我也不想使用DB::
任何东西,因为我想直接在模型对象之外进行操作。所以,我这样做了:
Model::whereNotNull('id')->delete();
显然,该列实际上必须存在,但是在标准的即开即用的Eloquent模型中,该id
列存在并且永远不会为空。我不知道这是否是最佳选择,但它可以满足我的目的。
Model::delete();
将完成同样的事情。
Model::delete()
引发了异常Non-static method Illuminate\Database\Eloquent\Model::delete() should not be called statically
。
我无法使用,Model::truncate()
因为它会出错:
SQLSTATE [42000]:语法错误或访问冲突:1701无法截断外键约束中引用的表
不幸的Model::delete()
是,它不起作用(至少在Laravel 5.0中):
非静态方法Illuminate \ Database \ Eloquent \ Model :: delete()不应以静态方式调用,假设$ this来自不兼容的上下文
但这确实有效:
(new Model)->newQuery()->delete()
如果您设置了软删除,则将软删除所有行。要完全删除所有行,包括软删除的行,可以更改为:
(new Model)->newQueryWithoutScopes()->forceDelete()