如何使用 Eloquent 删除表中的所有行?

问题描述 投票:0回答:14

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

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

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

laravel laravel-4 eloquent
14个回答
418
投票

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

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

MyModel::truncate();

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


124
投票

Laravel 5.2+ 解决方案。

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

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

Laravel 5.6解决方案

\App\Model::query()->delete();

76
投票

如果禁用

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

DB::statement("SET foreign_key_checks=0");
Model::truncate();
DB::statement("SET foreign_key_checks=1");

52
投票

我已经看到这两种方法都被用在种子文件中。

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

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

//or

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

即使你不能使用第一个,如果你想设置外键

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

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


15
投票

我想为那些通过 Google 访问此线程的人添加另一个选项。我需要完成此任务,但想保留

truncate()
重置的自动增量值。我也不想使用
DB::
任何东西,因为我想直接从模型对象上进行操作。所以,我选择了这个:

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

显然该列必须实际存在,但在标准的开箱即用的 Eloquent 模型中,

id
列存在并且永远不为空。我不知道这是否是最好的选择,但它适合我的目的。


14
投票

简单的解决方案:

 Mymodel::query()->delete();

13
投票

还有一个间接的方法:

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

示例:

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

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


9
投票

我无法使用

Model::truncate()
,因为它会出错:

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

不幸的是

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

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

但这确实有效:

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

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

(new Model)->newQueryWithoutScopes()->forceDelete()

7
投票

您可以尝试这个单行代码,它也保留软删除:

Model::whereRaw('1=1')->delete();

6
投票

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

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

4
投票

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

DB::query("TRUNCATE TABLE mytable");

1
投票

MyModel::truncate();

在命令行中:

php artisan tinker

然后

Post::truncate();


-1
投票

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

我知道使用原始 SQL 违反了 Laravel 美丽的代码哲学,但很难接受可能用数百个查询来代替一个查询。


-1
投票

在我的例子中,laravel 4.2 删除所有行,但不截断表

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

© www.soinside.com 2019 - 2024. All rights reserved.