如何使用Eloquent删除表中的所有行?
我的猜测是使用以下语法:
MyModel::all()->delete();
但是这没有用。 我相信这是非常简单的,但我已经search了关于这个主题的文档,找不到它!
MyModel::all()->delete()
不起作用的原因是因为all()
实际上触发了查询并返回一组Eloquent对象。
你可以使用截断方法,这适用于Laravel 4和5:
MyModel::truncate();
这将删除表中的所有行而不logging单个行删除。
如果您禁用foreign_key_checks
(我假设您使用MySQL),则可以使用Model::truncate()
)。
DB::statement("SET foreign_key_checks=0"); Model::truncate(); DB::statement("SET foreign_key_checks=1");
Laravel 5.2+解决scheme。
Model::getQuery()->delete();
只要抓住底层的build设者与表名,做任何事情。 不可能比这更整洁。
我已经看到这两种方法已被用于种子文件。
// Uncomment the below to wipe the table clean before populating DB::table('table_name')->truncate(); //or DB::table('table_name')->delete();
即使你不能使用第一个,如果你想设置外键 。
不能截断在外键约束中引用的表
所以使用第二个可能是个好主意。
有一个间接的方法:
myModel:where('anyColumnName', 'like', '%%')->delete();
例:
User:where('id', 'like' '%%')->delete();
Laravel查询构build器信息: https ://laravel.com/docs/5.4/queries
我想为通过Google获得此主题的人添加另一个选项。 我需要做到这一点,但要保留我的自动增量值truncate()
重置。 我也不想使用DB::
任何东西,因为我想直接操作模型对象。 所以我跟着这个去了
Model::whereNotNull('id')->delete();
显然这个列必须实际存在,但是在一个标准的,开箱即用的Eloquent模型中, id
列是存在的,并且不能为空。 我不知道这是不是最好的select,但它适用于我的目的。
在Laravel 3
完成此操作的最佳方式似乎是使用Fluent
界面截断表格,如下所示
DB::query("TRUNCATE TABLE mytable");
我无法使用Model::truncate()
因为它会发生错误:
SQLSTATE [42000]:语法错误或访问冲突:1701不能截断在外键约束中引用的表
不幸的是, Model::delete()
不起作用(至less在Laravel 5.0中):
非静态方法Illuminate \ Database \ Eloquent \ Model :: delete()不应被静态调用,假设$ this来自不兼容的上下文
但是这确实有效:
(new Model)->newQuery()->delete()
这将软删除所有行,如果你有软删除设置。 要完全删除包括软删除行在内的所有行,您可以更改为:
(new Model)->newQueryWithoutScopes()->forceDelete()
也可以做一个foreach循环..
$collection = Model::get(); foreach($collection as $c) { $c->delete(); }
与Travis vignon的回答类似,我需要雄辩模型的数据,如果条件正确,我需要删除或更新模型。 我结束了我的查询返回的最小和最大的字段返回(如果另一个字段被添加到表中,将符合我的select标准)以及原始select标准,以通过一个原始SQL查询更新字段相对于集合中每个对象的一个雄辩的查询)。
我知道原始SQL的使用违反了laravel美丽的代码哲学,但很难用可能的数百个查询代替。