简体   繁体   中英

Laravel belongsToMany relation condition

I have created many-to-many relation using belongsToMany function:

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

Now I want to create query with many-to-many condition. In SQL in would be:

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

I have tried to achieve this like:

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

Or

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

But it is not working. Any ideas how it should be? Thanks for any help.

Using ->with() doesn't actually limit the results of the Doctor::...->get() query; it simply tells Laravel what to return in the relationships attribute. If you actually want to enforce returning only Doctors that have a category 1 relationship, you need to use 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();

The with() function does not actually introduce a join in your query, it just loads the relation of all models as a second query. So the with() function couldn't possibly change the original result set.

What you are looking for is whereHas() . This will add a WHERE EXISTS clause to the existing query.

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

You can add whereHas condition for this. Try code below:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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