I have 3 tables
- users
- bases
- bases_users
In usersTable I have created a belongsToMany relation like
$this->belongsToMany('Bases', [
'foreignKey' => 'user_id',
'targetForeignKey' => 'base_id',
'joinTable' => 'bases_users',
]);
Now I am trying to fetch all users where user is under this login user bases.
Query like below
SELECT users.name FROM users
INNER JOIN bases_users on bases_users.user_id = users.id
WHERE bases_users.base_id in (1,2) //login user 1 has tow bases (1,2)
GROUP BY Users.id
I'm trying to get accepted data using below query with content
$this->Users->find()
->contain([
'UserAuthorities',
'Bases' => function($q) use($userId){
return $q->where(['Bases.users.id' => $userId]);
}
])
How can I match the data where BasesUsers.user_id = $userId
?
I have tried the code after @ndm comment like below
$queryUsers = $this->Users->find()
->contain([
'UserAuthorities',
'Bases'
])
->innerJoinWith('BasesUsers', function(\Cake\ORM\Query $q) {
return $q->where(['BasesUsers.user_id' => 10]);
})
->where($conditions)
->order($order)
;
Query is generating :
SELECT
...
FROM
users Users
INNER JOIN bases_users BasesUsers ON (
BasesUsers.user_id = 10
AND Users.id = BasesUsers.user_id
)
INNER JOIN user_authorities UserAuthorities ON UserAuthorities.id = Users.user_authority_id
WHERE
(
Users.company_id = 1
AND Users.is_deleted = FALSE
)
ORDER BY
Users.created DESC
LIMIT
20 OFFSET 0
Here My expecting query is
INNER JOIN bases_users BasesUsers ON (
BasesUsers.user_id = 10
)
Sample data
Users table :
id, name,
1 A
2 B
3 C
4 D
Bases table :
id Name
1 Base 1
2 Base 2
3 Base 3
BasesUsers:
id user_id base_id
1 1 1
2 1 2
3 2 1
4 3 1
5 4 3
6 3 2
Expected result for user id 1 logged in
name bases
A Base1,Base2
B Base1
C Base1,Base2
How I will remove AND Users.id = BasesUsers.user_id
from innerJoin with ?