【发布时间】:2020-11-03 02:23:04
【问题描述】:
当用户的 id 为 2(或其他数字)时,我试图在 UsersTitles 表中获取没有相关记录的游戏,但我得到了所有游戏。
控制器:
$this->loadModel('Games');
$games = $this->Games->find()->notMatching('Titles.TitlesUsers', function ($q){
return $q->where(['TitlesUsers.user_id'=> 2]);
})->distinct(['Games.id']);
游戏桌
class GamesTable {
$this->hasMany('Titles', [
'foreignKey' => 'game_id',
'dependent' => true
]);
}
标题表
class TitlesTable {
$this->belongsTo('Games', ['dependent' => false]);
$this->hasMany('TitlesUsers', [
'classname' => 'TitlesUsers',
'foreignKey' => 'title_id',
'dependent' => true
]);
}
TitlesUsers 表
class TitlesUsersTable {
$this->belongsTo('Titles',['dependent'=>false]);
$this->belongsTo('Users',['dependent'=>false]);
}
游戏桌内容
id | name
---|---------
1 | "Test A"
2 | "Test B"
3 | "Test C"
Titles 表格内容
id | game_id
---|---------
1 | 1
2 | 1
3 | 1
4 | 2
5 | 2
6 | 2
7 | 3
8 | 3
9 | 3
TitlesUsers 表格内容
id | title_id | user_id
---|----------|---------
1 | 1 | 2
生成的 SQL
SELECT
Games.id AS `Games__id`,
Games.name AS `Games__name`
FROM
games Games
LEFT JOIN titles Titles ON Games.id = (Titles.game_id)
LEFT JOIN titles_users TitlesUsers ON (
TitlesUsers.user_id = 2
AND Titles.id = (TitlesUsers.title_id)
)
WHERE
(TitlesUsers.id) IS NULL
GROUP BY
Games.id
如果我对直接相关的表执行 notMatching() ,它可以正常工作。当我试图获得深层 notMatching() 关联时,就会出现问题。
【问题讨论】:
标签: mysql cakephp orm associations cakephp-3.x