Laravel 如何使用Eloquent删除表中的所有行?
我的猜测是使用以下语法:Laravel 如何使用Eloquent删除表中的所有行?,laravel,laravel-4,eloquent,foreach,Laravel,Laravel 4,Eloquent,Foreach,我的猜测是使用以下语法: MyModel::all()->delete(); 但这并不奏效。我确信它非常简单,但我已经搜索了关于这个主题的文档,却找不到它 之所以MyModel::all()->delete()不起作用,是因为all()实际上触发了查询并返回了一组有说服力的对象 您可以使用truncate方法,这适用于Laravel 4和5: MyModel::truncate(); 这将删除表中的所有行,而不记录单个行的删除。在Laravel 3中完成此操作的最佳方法似乎是使用Flu
MyModel::all()->delete();
但这并不奏效。我确信它非常简单,但我已经搜索了关于这个主题的文档,却找不到它 之所以
MyModel::all()->delete()
不起作用,是因为all()
实际上触发了查询并返回了一组有说服力的对象
您可以使用truncate方法,这适用于Laravel 4和5:
MyModel::truncate();
这将删除表中的所有行,而不记录单个行的删除。在
Laravel 3
中完成此操作的最佳方法似乎是使用Fluent
界面截断表,如下所示
DB::query("TRUNCATE TABLE mytable");
我看到这两种方法都在种子文件中使用
// Uncomment the below to wipe the table clean before populating
DB::table('table_name')->truncate();
//or
DB::table('table_name')->delete();
如果要设置外键,即使不能使用第一个外键。
无法截断外键约束中引用的表
因此,使用第二个可能是个好主意。如果禁用
外键检查(我假设您使用MySQL),则可以使用Model::truncate()
我想为那些通过谷歌访问这个帖子的人添加另一个选项。我需要完成这项工作,但我想保留我的自动增量值,truncate()
resets。我也不想使用DB::
任何东西,因为我想直接在模型对象之外进行操作。所以,我选择了这个:
Model::whereNotNull('id')->delete();
显然,该列必须实际存在,但在标准的开箱即用的雄辩模型中,id
列存在并且从不为空。我不知道这是否是最好的选择,但它符合我的目的。与Travis vignon的回答类似,我需要雄辩模型的数据,如果条件正确,我需要删除或更新模型。最后,我得到了查询返回的最小和最大I'd字段(以防在表中添加了另一个符合我的选择条件的字段)以及原始选择条件,以便通过一个原始SQL查询(而不是集合中每个对象的一个雄辩查询)更新字段
我知道原始SQL的使用违反了laravels优美的代码理念,但很难接受数百个查询来代替一个查询。有一种间接的方法:
myModel:where('anyColumnName', 'like', '%%')->delete();
例如:
User:where('id', 'like' '%%')->delete();
Laravel查询生成器信息:我无法使用Model::truncate()
,因为它会出错:
SQLSTATE[42000]:语法错误或访问冲突:1701无法截断外键约束中引用的表
不幸的是,Model::delete()
不起作用(至少在Laravel 5.0中是这样):
假设$this来自不兼容的上下文,则不应静态调用非静态方法illumb\Database\elount\Model::delete()
但这确实有效:
(new Model)->newQuery()->delete()
如果设置了“软删除”,则将软删除所有行。要完全删除所有行(包括软删除的行),您可以更改为:
(new Model)->newQueryWithoutScopes()->forceDelete()
Laravel 5.2+解决方案
Model::getQuery()->delete();
只需使用表名抓取底层生成器,然后执行任何操作。
再整洁不过了
Laravel 5.6解决方案
\App\Model::query()->delete();
我也能做一个循环
$collection = Model::get();
foreach($collection as $c) {
$c->delete();
}
使用外键约束的Lumen 5.5的解决方案:
$categories = MusicCategory::all();
foreach($categories as $category)
{
$category->delete();
}
return response()->json(['error' => false]);
您可以尝试使用这一行程序,它还可以保留软删除:
Model::whereRaw('1=1')->delete();
简单解决方案:
Mymodel::query()->delete();
在我的例子中,Laravel4.2删除所有行,但不截断表
DB::table('your_table')->delete() 我为我的问题添加了一个Laravel3解决方案,供未来读者参考。很好。如果其他人在2016年在这里搜索自己,这也适用于Laravel 5。注意:truncate()还会重置任何自动增量计数器(还请注意,您不能截断具有外键约束的表)。仅供参考:truncate不会触发删除事件。如果您真的想使用MyModel::all()->delete()
,请使用foreach(MyModel::all())作为$e){$e->delete()}
删除
显然与截断
不同。@sudopeople指出两者的区别会很有帮助。我还可以将它添加到我的答案中。TRUNCATE不能用于事务中,因为它不受回滚的影响。在这种情况下,这可以通过(new MyModel)->newQuery()->delete()实现Schema::enableForeignKeyConstraints()<代码>模型::删除()
将完成同样的事情。不幸的是,Model::delete()
抛出一个异常非静态方法Illumb\Database\Eloquent\Model::delete()不应静态调用,至少在Laravel 5.0中是这样。@aschipfl实际上没有太多解释。代码从id为“%”的用户运行SQLDELETE,该id匹配表中的所有行,从而删除了所有内容。这让我上路了。最后,我在另一个模型上执行了一个pull(),以获取我所需的ID数组,然后使用该数组使用方法从我的模型中删除所有记录,其中方法:$itemsAllContentIDs=Item::where('user_ID',$userId)->pull('Item_content_ID')->all()代码>ItemsContent::其中('id',$itemsAllContentIDs)->delete()代码>如果其他人不明白为什么会这样,模型类会通过_调用magic方法将方法转发给构建器。因为模型类本身有一个delete方法,所以调用model::delete()会在您真正需要Builder方法时调用model方法。因此,要显式获取生成器,可以使用getQuery()。如果需要,这也不会删除相关表。它将强制删除所有记录,而不管软删除是打开还是关闭Model::whereNotNull('id')->delete();--当软删除在技术上是“是”时,将执行软删除…但我认为这似乎有点不必要,因为有更好的单查询选项。@Pete我知道。。其他人已经给出了答案。。。我在试着回答
Mymodel::query()->delete();