我使用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();
但是它不起作用。任何想法应该如何?感谢您的帮助。
答案 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();