Laravel Eloquent通过关联列进行过滤

52

使用 Eloquent ORM,我设置了如下的模型:Post belongsToMany Category

Post.php

public function categories()
{
    return $this->belongsToMany('Category', 'posts_categories');
}

我希望按照文章分类关系中的某一列进行筛选。

因此,我想要做类似这样的操作:

$posts->where('categories.slug', '=', Input::get('category_slug'));

这并不起作用。

我还尝试了:

$with['categories'] = function($query){ 
    $query->where('slug', '=', Input::get('category_slug'));
};

$posts::with($with)->get();

但是我认为那是用于过滤分类而不是按分类过滤。

有人可以指点一下吗?

2个回答

110

我现在无法访问我的 Vagrant box,但我相信这应该可以解决问题:

$posts = Post::whereHas('categories', function($q)
{
    $q->where('slug', '=', Input::get('category_slug'));

})->get();

1
非常好!不过必须升级到 Laravel v4.1,因为这是一个新功能。 - iamjonesy
非常感谢。我花了几个小时来解决这个问题,最终终于解决了!:O - Saifur Rahman Mohsin
正是我所需要的! - J Foley
3
whereHas 进行全表扫描。对于小表来说,如果比如 (categories) 有 100,000 行,这样做还可以接受,但速度将会显著变慢。那么你该怎么办呢? - Cengkuru Michael
whereHas 过滤掉了非关联结果。有没有办法不过滤空关联结果? - Dr. House

5

以下是一个快速过滤相关模型列的方法:

$allConsultants = Consultant::whereHas('user', function($query)
{
    $query->where('is_approved', '=', 1);

})->get();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接