【问题标题】:Laravel 5 `belongsToMany` with `wherePivot` eloquent query is not working properlyLaravel 5 `belongsToMany` 和 `wherePivot` 雄辩查询无法正常工作
【发布时间】:2016-06-30 10:19:17
【问题描述】:

假设我有users,coursescourse_users 表,用户属于许多课程,透视表course_users 的结构如下:

|用户 ID | course_id |关系类型 |
|------------------------------------- ----------|

现在我有以下代码:

$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子句。

【问题讨论】:

    标签: php mysql laravel laravel-5 eloquent


    【解决方案1】:

    关系上的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');
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-09
      • 2019-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      • 2017-11-11
      • 2018-01-26
      相关资源
      最近更新 更多