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

Pet*_*ete 115 laravel eloquent laravel-4

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

MyModel::all()->delete();
Run Code Online (Sandbox Code Playgroud)

但那没用.我确信它非常简单,但我已经搜索了关于这个主题的文档而无法找到它!

bil*_*alq 242

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

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

MyModel::truncate();
Run Code Online (Sandbox Code Playgroud)

这会丢弃表中的所有行,而不记录单个行删除.

  • 尼斯.如果其他人在2016年谷歌自己在这里,这也适用于Laravel 5. (37认同)
  • 注意:truncate()也会重置任何AUTO_INCREMENT计数器(另请注意,您不能截断具有外键约束的表.) (10认同)
  • 仅供参考:Turncate不会触发删除事件. (6认同)

Yau*_*hyk 59

Laravel 5.2+解决方案.

Model::getQuery()->delete();
Run Code Online (Sandbox Code Playgroud)

只需使用表名抓取底层构建器并执行任何操作.不能比那更整洁.

Laravel 5.6解决方案

\App\Model::query()->delete();
Run Code Online (Sandbox Code Playgroud)

  • 如果其他人对此为何起作用感到困惑,Model类会通过__call魔术方法[此处]将方法转发给Builder(https://github.com/laravel/framework/blob/5.2/src/Illuminate/Database/机锋/ Model.php#L3478-L3494).因为模型类本身有一个delete方法,所以当你真正想要Builder方法时,调用Model :: delete()会调用Model方法.因此,要明确获取构建器,可以使用getQuery(). (8认同)
  • 模型::whereNotNull('id')->delete(); -- 当软删除开启时将执行软删除 (2认同)

小智 55

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

DB::statement("SET foreign_key_checks=0");
Model::truncate();
DB::statement("SET foreign_key_checks=1");
Run Code Online (Sandbox Code Playgroud)

  • 在Laravel 4中,您使用DB :: unrepared() (2认同)
  • 您还可以使用 Schema::disableForeignKeyConstraints(); & 架构::enableForeignKeyConstraints(); (2认同)

gia*_*kis 31

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

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

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

//or

DB::table('table_name')->delete();
Run Code Online (Sandbox Code Playgroud)

即使您想要设置外键,也不能使用第一个.

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

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

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

Rej*_*aul 12

有间接的方式:

myModel:where('anyColumnName', 'like', '%%')->delete();
Run Code Online (Sandbox Code Playgroud)

例:

User:where('id', 'like' '%%')->delete();
Run Code Online (Sandbox Code Playgroud)

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


小智 9

简单的解决办法:

 Mymodel::query()->delete();
Run Code Online (Sandbox Code Playgroud)


loo*_*vis 8

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

Model::whereNotNull('id')->delete();
Run Code Online (Sandbox Code Playgroud)

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

  • 不幸的是`Model :: delete()`抛出异常`非静态方法Illuminate\Database\Eloquent\Model :: delete()不应该被静态调用,至少在Laravel 5.0中是这样. (5认同)

Dav*_*ler 6

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

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

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

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

但这确实有效:

(new Model)->newQuery()->delete()
Run Code Online (Sandbox Code Playgroud)

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

(new Model)->newQueryWithoutScopes()->forceDelete()
Run Code Online (Sandbox Code Playgroud)


小智 6

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

Model::whereRaw('1=1')->delete();
Run Code Online (Sandbox Code Playgroud)


小智 6

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

MyModel::query()->delete();
Run Code Online (Sandbox Code Playgroud)