Laravel属于ToMany关系条件

时间:2019-02-14 13:20:23

标签: php mysql laravel eloquent relationship

我使用belongsToMany函数创建了多对多关系:

class Doctor extends Model
{
...
    public function categories()
    {
        return $this->belongsToMany('App\Category', 'doctors_to_categories', 'doctor_id', 'category_id');
    }
...
}

现在,我想创建具有多对多条件的查询。在SQL中将是:

SELECT *
FROM `doctors`
JOIN `doctors_to_categories`
    ON `doctors_to_categories`.`doctor_id` = `doctors`.`id`
WHERE `doctors_to_categories`.`category_id` = 1

我试图实现以下目标:

$doctors = Doctor::with(['categories' => function($query) {
    $query->where('category_id', '=', 1);
}])->get();

$doctors = Doctor::with(['categories' => function($query) {
    $query->where('categories.id', '=', 1);
}])->get();

但是它不起作用。任何想法应该如何?感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

使用email实际上并没有限制password查询的结果;它只是告诉Laravel Designation属性中返回什么。如果您实际上只想强制要求退回具有1类关系的Doctor,则需要使用->with()

Doctor::...->get()

答案 1 :(得分:1)

relationships函数实际上并未在查询中引入联接,它只是将所有模型的关系作为第二个查询来加载。因此,whereHas()函数无法更改原始结果集。

您要寻找的是whereHas()。这会将$doctors = Doctor::whereHas('categories', function($query) { $query->where('categories.id', '=', 1); // `id` or `categories.id` should work, but `categories.id` is less ambigious })->get(); 子句添加到现有查询中。

with()

答案 2 :(得分:0)

您可以为此添加whereHas条件。请尝试以下代码:

$doctors = Doctor::with('categories')->whereHas('categories', function($query) {
        $query->where('id', 1);
    })->get();