2016-03-15 1 views
0

Пусть у меня есть users,courses и course_users таблицы, пользователи принадлежит многим курсам и структура сводной таблицы course_users как ниже:Laravel 5 `` belongsToMany` с wherePivot` красноречивым запрос не работает должным образом

| user_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 п.

ответ

3

Метод wherePivot в отношении отношений - это всего лишь ярлык для метода 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'); 
} 
Смежные вопросы