如何使用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美丽的代码哲学,但很难用可能的数百个查询代替。