假设我有users,courses
和course_users
表,用户属于许多课程,数据透视表的结构course_users
如下:
user_id | course_id | relation_type |
|-----------------------------------------------|
现在我有下面的代码:
$user = User:find(1);
我在user
模型中具有波纹管功能:
public function courses(){
return $this->belongsToMany('App'Models'Course')->wherePivot('relation_type', 1)->orWherePivot('relation_type', 0)->withPivot('relation_type', 'created_at', 'updated_at');
}
如果我想获取用户的课程:
$user->courses();
但是上面函数的输出查询是这样的:
select
`courses`.*, `course_user`.`user_id` as `pivot_user_id`,`course_user`.`course_id` as `pivot_course_id`,
`course_user`.`relation_type` as `pivot_relation_type`,`course_user`.`created_at` as `pivot_created_at`, `course_user`.`updated_at` as `pivot_updated_at`
from
`courses` inner join `course_user` on `courses`.`id` = `course_user`.`course_id`
where
`course_user`.`user_id` = '1' and `course_user`.`relation_type` = '0' or `course_user`.`relation_type` = '1';
但是我需要这样的东西:
select
`courses`.*, `course_user`.`user_id` as `pivot_user_id`, `course_user`.`course_id` as `pivot_course_id`,
`course_user`.`relation_type` as `pivot_relation_type`, `course_user`.`created_at` as `pivot_created_at`, `course_user`.`updated_at` as `pivot_updated_at`
from
`courses` inner join `course_user` on `courses`.`id` = `course_user`.`course_id`
where
`course_user`.`user_id` = '1' and (`course_user`.`relation_type` = '0' or `course_user`.`relation_type` = '1');
区别在于where
条款。
关系上的wherePivot
方法只是where
方法的快捷方式,但它负责在数据透视表上添加约束限定符。因此,它不支持闭包,这是您需要使用的,以便对约束进行分组。因此,您需要直接调用 where
方法,并手动将表名限定符添加到 where 条件中。
像这样:
public function courses() {
return $this->belongsToMany('App'Models'Course')
// pass a closure to group your constraints
->where(function ($query) {
return $query->where('course_user.relation_type', 1)
->orWhere('course_user.relation_type', 0);
})
->withPivot('relation_type', 'created_at', 'updated_at');
}