我目前在使用Eloquent和如何订购我的查询范围方面遇到了一些麻烦。
我的目标是获得带有注释的页面和存储在会话变量中的页面。最重要的是,我还有一个过滤系统来获取特定类别的页面。
我有两个作用域:
public function scopeCategoryFilter($query, $filters = array())
{
return !(empty($filters)) ? $query->whereIn('page_type_code', $filters) : $query;
}
public function scopeInSession($query, $pages = array())
{
return !empty($pages) ? $query->orWhereIn('code', $pages) : $query;
}
和我雄辩的请求:
$pages = Page::has('Comments')
->InSession(Session::get('navigation.pagelist', []))
->CategoryFilter($filters)
->get();
我没有错误,但结果不是我所期望的。
这个查询返回me:
(post with Comments) 或 (post in session with given类别)
我想要:
(帖子有评论或在会话中)->给定类别。
我认为问题是类别过滤器只适用于我的InSession作用域返回的页面。
所以我找到了一个解决方案:
$pages = Page::has('Comments')
->CategoryFilter($filters)
->InSession(Session::get('navigation.pagelist', []))
->CategoryFilter($filters)
->get();
但是我不喜欢两次使用我的CategoryFilter作用域。
你知道我如何在同一个Eloquent请求中不使用我的作用域两次而得到预期的结果吗?也许是要改变我的瞄准镜?
谢谢!
你必须把你的CategoryFilter
和InSession
包装成另一个where
,我认为它看起来像这样:
$pages = Page::has('Comments')->where(function($query) use($filters) {
return $query->InSession(Session::get('navigation.pagelist', []))
->CategoryFilter($filters);
})->get();
这应该能奏效。
我自己在搜索用户时使用过这个,搜索不同的字段,但我需要排除一些用户,我这样做:
public function scopeFindUser($query, $str, $alreadySelected) {
return $query->where(function($query) use($str, $alreadySelected) {
return $query->where('first_name', 'LIKE', "%" . $str . "%")
->orWhere('last_name', 'LIKE', "%" . $str . "%")
->orWhere('email', 'LIKE', "%" . $str . "%");
})->whereNotIn('id', $alreadySelected);
}