Есть 2 таблицы со связью многие ко многим
Первая (users)
id | name
1 | maxim
2 | lena
Вторая (roles)
id | role_name
1 | admin
2 | moder
3 | author
И таблица связей (relation)
id | user_id | role_id
1 | 1 | 2
2 | 2 | 2
3 | 2 | 3
И так Максим у нас только модер а Лена и модер и автор.
В модели Users прописана связь
public function getRoles(){
return $this->hasMany(Roles::className(),['id'=>'role_id'])
->viaTable('relation', ['user_id' => 'id']);
}
Делаем запрос
$query = Users::find()
->joinWith(['roles rl'])
->andWhere(['rl.id', $searchModel->roles])
->all();
"$searchModel->roles" - Параметр передаваемый из формы являет собой массив чисел ( id ролей) в данном примере передадим такой массив [2,3].
И само собой получим Максима и Лену что правильно так как во "Where" имеем "rl.id in (2,3)"
но мне нужно получить только ту запись у которой есть оба значения а не одно из (в данном случае Лену)
пробовал делать вот так
$query = Users::find()
->joinWith(['roles rl']);
foreach ($searchModel->roles as $role){
$query->andWhere(['=','rl.id', $role]);
}
$result = $query->all();
И само собой получил null что ожидаемо.
Прошу подсказать вариант решения данного вопроса. А именно получения записи у которой будут оба значения со с вязаной таблицы а не одно из.