繁体   English   中英

Laravel 4-雄辩的查询范围顺序

[英]Laravel 4 - Eloquent query scope order

我目前在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请求中不使用两次示波器就可以得到预期的结果? 也许改变了我的范围?

谢谢!

您必须将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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM