欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

在Laravel中合并'和'whereHas'5

我在Laravel 5中有这个代码,使用了非常好的工作:

$filterTask = function($query) use ($id) {
    $query->where('taskid', $id);
};

User::whereHas('submissions', $filterTask)->with(['submissions' => $filterTask])->get();

基本上,目标是让只有那些使用过滤提交的用户才能使用这些用户。然而,似乎浪费了运行whereHas使用相同回调函数的方法。有没有办法简化呢?

谢谢。

3 
不,没有其他方式(使用c的雄辩关系查询)。为什么会浪费? -  Jarek Tkaczyk Apr 12 '15 at 17:47
   
那么,因为我们过滤了两次提交的条件; 我只是希望有一个解决方案可以使它成为一个查询而不是更多,但是@lukasgeiter完全清楚了。 -  iCore Apr 13 '15 at 17:40
   
为什么这个答案的选票太少了? -  whoan Jul 15 '16 at 3:22

 

 
  

正确答案
在性能方面,您无法真正优化任何内容(除非您从雄辩的关系转移到联接)。
有或没有
whereHas,将运行两个查询。一个选择所有用户另一个加载相关模型。当添加条件时,添加whereHas一个子查询,但它仍然是两个查询。

但是,在语法上,您可以通过向模型添加查询范围(甚至是要更频繁地使用这种模型的基本模型)来优化此操作

public function scopeWithAndWhereHas($query, $relation, $constraint){
    return $query->whereHas($relation, $constraint)
                 ->with([$relation => $constraint]);
}

用法:

User::withAndWhereHas('submissions', function($query) use ($id){
    $query->where('taskid', $id);
})->get();
分享
 
   
非常有用的答案,谢谢! -  iCore Apr 13 '15 at 17:57
   
我有这个问题了两天,现在它的作用就像一个魅力。 -  菲利斯·彼得斯 十月26 '16在6:42
 

你可以使用它:

User::whereHas('submissions', $filterTask)->get();

你不需要使用->with()方法。上面的代码将获得所有用户,它们的提交等于你的规则。

分享
 
   
with部分需要约束,过滤,加载关系。还要避免N + 1的问题。 -  lagbox Apr 12 '15 at 18:02
   
哦,是的 所以, ->with()可以在加载关系之前检查条件,这就是为什么只能使用->with()您不需要检查条件两次。 -  mcklayin Apr 12 '15 at 18:09
   
在这种情况下,OP都需要。withwhereHas -  lagbox 4月12日'15在18:11
来自 http://stackoverflow.com/questions/29591931/merge-with-and-wherehas-in-laravel-5
普通分类: