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)
这会丢弃表中的所有行,而不记录单个行删除.
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)
小智 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)
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)
即使您想要设置外键,也不能使用第一个.
无法截断外键约束中引用的表
所以使用第二个可能是个好主意.
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
我想为通过Google访问此帖子的人添加另一个选项.我需要完成此操作,但希望保留truncate()重置的自动增量值.我也不想使用DB::任何东西,因为我想直接从模型对象操作.所以,我接受了这个:
Model::whereNotNull('id')->delete();
Run Code Online (Sandbox Code Playgroud)
显然,该列必须实际存在,但在标准的,开箱即用的Eloquent模型中,该id列存在且永远不为空.我不知道这是否是最好的选择,但它适用于我的目的.
我无法使用,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)
| 归档时间: |
|
| 查看次数: |
136140 次 |
| 最近记录: |