我正在尝试使用CakePHP 3.0 beta 3构建(或多或少复杂)查询。我有以下实体:
用户belongsToMany Group 任务belongsToMany用户(别名'收件人') 任务belongsToMany Group
这是一个任务管理系统。可以向特定用户或命名用户组发出任务。
我现在正在尝试查找属于当前用户的任务或当前用户所属的组(与特定用户相关的所有任务)。我有用户ID和用户所属的组列表。
我已设法使用以下代码使其工作:
$queryOptions = [
'contain' => [
'Recipients', 'Groups'
]
];
$tasksForUser = $this->Tasks->find('all', $queryOptions)->matching('Recipients', function ($q) use ($user_id) {
return $q->where(['Recipients.id' => $user_id]);
})->toArray();
$tasksForGroup = $this->Tasks->find('all', $queryOptions)->matching('Groups', function($q) use ($group_ids) {
return $q->where(['Groups.id IN' => $group_ids]);
})->toArray();
$this->set('tasks', array_merge($tasksForUser, $tasksForGroup));
CakePHP 3.0声称有一个sophicsticated ORM模型,所以有没有办法在一个查询中执行它?它可能会让我能够动态过滤重复项。
提前致谢, 戴夫
答案 0 :(得分:2)
您需要UNION
两个查询。 ORM支持此声明。 MySQL默认情况下会通过清除重复的结果来实现它(假定DISTINCT
),这样你就可以了。
Cake的文档有a nice example,它应该适用于你的情况:
$tasksForUser = $tasks->find()
->contain('Recipients', function ($q) use ($user_id) {
return $q->where(['Recipients.id' => $user_id]);
})
;
$tasksForGroup = $tasks->find()
->contain('Groups', function($q) use ($group_ids) {
return $q->where(['Groups.id IN' => $group_ids]);
})
;
$tasksForGroup->union($tasksForUser);
因此,您只需将代码放在模型中,即可从控制器中调用自定义查找。