Laravel 使用where语句删除所有行

Laravel 使用where语句删除所有行,laravel,eloquent,Laravel,Eloquent,我想删除所有标有“isOnly”的选票,这意味着该条是在全体会议之前投票的 我编写了这段代码,删除了所有的投票 foreach($commision->articles as $article) { $article->votes()->delete(); $article->update([ 'isVoted' => false ]); } 使用标志“isOnly”==tru

我想删除所有标有“isOnly”的选票,这意味着该条是在全体会议之前投票的

我编写了这段代码,删除了所有的投票

    foreach($commision->articles as $article) {
        $article->votes()->delete();
        $article->update([
            'isVoted' => false
        ]);
    }

使用标志“isOnly”==true删除所有投票的正确方法是什么?您可以使用delete调用将方法堆栈到何处

$article->votes()->where('isOnly', true)->delete();
一个更好的解决方案是避免将foreach放在一起,因此只运行一个查询

$articleIds = $commision->pluck('articles.id'); //if the articles are already loaded calling a collection method pluck()
$articleIds = $commision->articles()->pluck('id'); // if articles are not loaded calling a query builder method pluck()
Votes::whereHas('article', function($articleQueryBuilder) use($articleIds) {
    $articleQueryBuilder->whereIn('id', $articleIds);
})->where('isOnly', true)->delete();
Article::whereIn('id', $articleIds)->update([
    'isVoted' => false
]);

这将加快delete()和update()的处理速度。

您可以使用delete调用将方法堆栈到何处

$article->votes()->where('isOnly', true)->delete();
一个更好的解决方案是避免将foreach放在一起,因此只运行一个查询

$articleIds = $commision->pluck('articles.id'); //if the articles are already loaded calling a collection method pluck()
$articleIds = $commision->articles()->pluck('id'); // if articles are not loaded calling a query builder method pluck()
Votes::whereHas('article', function($articleQueryBuilder) use($articleIds) {
    $articleQueryBuilder->whereIn('id', $articleIds);
})->where('isOnly', true)->delete();
Article::whereIn('id', $articleIds)->update([
    'isVoted' => false
]);

这将加快对delete()和update()的处理速度。

这里有一种按条件删除的方法

$article->votes()->get()->filter(function($item){
     return $item->isOnly == true;
})->each(function($vote){$vote->delete();});
此语句将获得所有投票,并对投票应用过滤器功能,这将为我们提供isOnly==true的投票。然后,每个函数将删除返回的投票。
这会有帮助。:)

这里有一种按条件删除的方法

$article->votes()->get()->filter(function($item){
     return $item->isOnly == true;
})->each(function($vote){$vote->delete();});
此语句将获得所有投票,并对投票应用过滤器功能,这将为我们提供isOnly==true的投票。然后,每个函数将删除返回的投票。
这会有帮助。:)

$commission->articles的结构是什么,只是集合内部的一个直接键,show
dd($commission->articles)
,你可以使用forget()和filter()什么是$commission->articles的结构,只是集合本身内部的一个直接键,show
dd($commission->articles)
,您可以使用forget()和filter()来解释此查询的作用,当您执行
投票()
时,您仍在使用
雄辩的
,因此任何进一步的
where
或类似方法都将附加/添加到
投票()
查询中。非常感谢,这真的很有帮助。@Steve更正了一些错误和两个解决方案以获取文章ID只是为了解释此查询的作用,当您执行
投票()
时,您仍在使用
雄辩的
,因此任何进一步的
where
或类似方法都将附加/添加到
投票()
查询中。非常感谢,这真的很有帮助。@Steve纠正了一些错误和两个解决方案,以获得比foreach OP使用的更糟糕的文章。假设每个委员会有10个条款,每个条款有100票。您的解决方案将运行1000个查询。OP解决方案将运行10次。文章id解决方案将只运行2个查询,无论每篇文章和每篇文章的投票数是多少。我说过这是删除的一种方式。我没说这是唯一的办法。第二个sql仍然遍历所有行。另外,如果只对isOnly进行索引,那么它在sql server上的负载就会减少。一次删除1000行的查询和一次删除1行的1000个查询之间有很大的区别。对于1000个查询(带索引),从50毫秒的查询到2分钟的差异。你需要学习更多关于性能的知识。这甚至是foreach OP使用的最糟糕的。假设每个委员会有10个条款,每个条款有100票。您的解决方案将运行1000个查询。OP解决方案将运行10次。文章id解决方案将只运行2个查询,无论每篇文章和每篇文章的投票数是多少。我说过这是删除的一种方式。我没说这是唯一的办法。第二个sql仍然遍历所有行。另外,如果只对isOnly进行索引,那么它在sql server上的负载就会减少。一次删除1000行的查询和一次删除1行的1000个查询之间有很大的区别。对于1000个查询(带索引),从50毫秒的查询到2分钟的差异。您需要了解更多有关性能的信息。