181

我的猜测是使用以下语法:

MyModel::all()->delete();

但这没有用。我确定它非常简单,但是我搜索了有关该主题的文档但找不到!

4

14 回答 14

359

原因MyModel::all()->delete()不起作用是因为all()实际上会触发查询并返回 Eloquent 对象的集合。

您可以使用 truncate 方法,这适用于 Laravel 4 和 5:

MyModel::truncate();

这会从表中删除所有行,而不记录单个行删除。

于 2013-03-19T01:19:41.617 回答
99

Laravel 5.2+解决方案。

Model::getQuery()->delete();

只需使用表名获取底层构建器并执行任何操作。没有比这更整洁的了。

Laravel 5.6解决方案

\App\Model::query()->delete();
于 2016-02-25T21:13:25.863 回答
73

Model::truncate()如果您禁用,您可以使用foreign_key_checks(我假设您使用 MySQL)。

DB::statement("SET foreign_key_checks=0");
Model::truncate();
DB::statement("SET foreign_key_checks=1");
于 2013-12-19T15:34:23.087 回答
47

我已经看到种子文件中使用了这两种方法。

// Uncomment the below to wipe the table clean before populating

DB::table('table_name')->truncate();

//or

DB::table('table_name')->delete();

即使您想设置外键也不能使用第一个。

无法截断外键约束中引用的表

所以使用第二个可能是个好主意。

于 2013-10-18T10:42:04.167 回答
13

有一个间接的方法:

myModel:where('anyColumnName', 'like', '%%')->delete();

例子:

User:where('id', 'like' '%%')->delete();

Laravel 查询构建器信息:https ://laravel.com/docs/5.4/queries

于 2015-10-28T03:25:40.927 回答
12

我想为那些通过 Google 访问该主题的人添加另一个选项。我需要完成此操作,但想保留truncate()重置的自动增量值。我也不想使用DB::任何东西,因为我想直接从模型对象中操作。所以,我选择了这个:

Model::whereNotNull('id')->delete();

显然,该列必须实际存在,但在标准的、开箱即用的 Eloquent 模型中,该id列存在并且永远不会为空。我不知道这是否是最佳选择,但它适用于我的目的。

于 2014-05-01T20:51:33.367 回答
8

我无法使用Model::truncate(),因为它会出错:

SQLSTATE [42000]:语法错误或访问冲突:1701 无法截断外键约束中引用的表

不幸Model::delete()的是不起作用(至少在 Laravel 5.0 中):

假设 $this 来自不兼容的上下文,不应静态调用非静态方法 Illuminate\Database\Eloquent\Model::delete()

但这确实有效:

(new Model)->newQuery()->delete()

如果您设置了软删除,这将软删除所有行。要完全删除所有行,包括软删除的行,您可以更改为:

(new Model)->newQueryWithoutScopes()->forceDelete()
于 2016-02-25T10:48:34.473 回答
8

简单的解决方案:

 Mymodel::query()->delete();
于 2019-09-08T15:31:12.100 回答
6

你也可以试试这个保留软删除的单行:

Model::whereRaw('1=1')->delete();
于 2018-09-27T12:08:34.127 回答
4

完成此操作的最佳方法Laravel 3似乎是使用Fluent接口截断表格,如下所示

DB::query("TRUNCATE TABLE mytable");
于 2013-03-19T15:49:53.180 回答
0

问题truncate在于它意味着立即提交,所以如果在事务中使用它,风险是你发现表是空的。最好的解决方案是使用delete

MyModel::query()->delete();
于 2021-10-08T13:35:22.817 回答
-1

与 Travis vignon 的回答类似,我需要来自 eloquent 模型的数据,如果条件正确,我需要删除或更新模型。我最终获得了查询返回的最小和最大字段(如果将另一个字段添加到满足我的选择条件的表中)以及原始选择条件,以通过一个原始 SQL 查询更新字段(如与集合中的每个对象一个雄辩的查询相反)。

我知道使用原始 SQL 违反了 laravel 美丽的代码理念,但它很难忍受可能数百个查询来代替一个。

于 2014-05-02T19:04:03.877 回答
-1

在我的情况下 laravel 4.2 删除所有行,但不截断表

DB::table('your_table')->delete();

于 2020-11-11T10:37:40.033 回答
-4

使用带有外键约束的 Lumen 5.5 的解决方案:

$categories = MusicCategory::all();
foreach($categories as $category)
{
$category->delete();

}
return response()->json(['error' => false]);
于 2018-02-06T18:33:59.087 回答