ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

在 Laravel 7 和 8 中,您can do this

B
Basil Musa

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

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

MyModel::truncate();

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


酷,不知道那个!谢谢!只是出于好奇(以及对于未来的读者)有没有办法在 Laravel 3 中做类似的事情?还是根本没有支持删除 Laravel 3 中表中所有行的方法(除了诉诸 PDO 或其他方法)?
注意: truncate() 还会重置任何 AUTO_INCREMENT 计数器(另请注意,您不能截断具有外键约束的表。)
仅供参考:Turncate 不会触发删除事件。
如果您真的想使用 MyModel::all()->delete(),请使用 foreach (MyModel::all() as $e) { $e->delete() }
即使在截断子表之后,Eloquent 仍然抱怨由于外键引用而无法截断父表。 @Yauheni 下面的回答对我有用。
K
Ketav

Laravel 5.2+ 解决方案。

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

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

Laravel 5.6 解决方案

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

如果其他人对它的工作原理感到困惑,Model 类会通过 __call 魔术方法 here 将方法转发给 Builder。因为模型类本身有一个删除方法,所以调用 Model::delete() 会调用 Model 方法,而您确实需要 Builder 方法。因此,要显式获取构建器,您可以使用 getQuery()。
如果您愿意,这也不会删除相关表。
它将强制删除所有记录,无论软删除是打开还是关闭
模型::whereNotNull('id')->delete(); -- 软删除开启时会进行软删除
h
hasan.hameed

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

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

在 Laravel 4 中,您使用 DB::unprepared()
您还可以使用 Schema::disableForeignKeyConstraints(); & Schema::enableForeignKeyConstraints();
g
giannis christofakis

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

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

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

//or

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

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

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

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


delete 显然与 truncate 不同。
@sudopeople指出差异真的很有帮助。我也可以将其添加到我的答案中。
TRUNCATE 不能在事务中使用,因为它不受 ROLLBACK 的影响。在这种情况下,这可以通过 (new MyModel)->newQuery()->delete() 来实现。
O
Oscar Gallardo

有一个间接的方法:

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

例子:

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

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


@aschipfl 实际上没有太多解释。代码运行与表中所有行匹配的 SQL DELETE FROM users WHERE id LIKE '%%',从而删除所有内容。
这让我上路了。我最终在另一个模型上执行 pluck() 以获取我需要的 ID 数组,然后使用该数组使用 whereIn 方法从我的模型中删除所有记录:$itemsAllContentIDs = Item::where('user_id', $userId)->pluck('item_content_id')->all(); ItemsContent::whereIn('id', $itemsAllContentIDs)->delete();
l
lookitsatravis

我想为那些通过 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,至少在 Laravel 5.0 中是这样。
a
ali filali

简单的解决方案:

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

这是 already posted as a solution 18 个月前。
如果您的模型使用概念软删除,请使用 query()->forceDelete()
D
Dave James Miller

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

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

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

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

但这确实有效:

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

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

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

j
jfeid

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

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

g
giannis christofakis

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

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

R
Riccardo Venturini

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

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

S
Sidney

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

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


G
Ganesan J

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

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


A
Alain Berrier

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

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

}
return response()->json(['error' => false]);