Laravel 4 - Eloquent查询范围顺序

时间:2014-03-27 12:04:17

标签: php laravel laravel-4 eloquent

我目前在使用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();

我没有错误,但结果不是我所期望的。

此查询返回我:

  

(有评论的帖子)(与给定的会话中的帖子   类别)

我想拥有:

  

(帖子有评论或在会话中) - >使用给定的类别。

我认为问题是类别过滤器仅适用于我的 InSession 范围返回的页面。

所以我找到了解决方案:

$pages = Page::has('Comments')
    ->CategoryFilter($filters)
    ->InSession(Session::get('navigation.pagelist', []))
    ->CategoryFilter($filters)
    ->get();

但我不喜欢两次使用我的CategoryFilter范围。

你是否知道如何在同一个Eloquent请求中不使用我的范围两次就能得到预期的结果?也许在我的范围内改变一些东西?

谢谢!

1 个答案:

答案 0 :(得分:3)

您必须将CategoryFilterInSession包装到另一个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);
}