通过CakePHP 3.0中的多个关联(OR)进行查询

时间:2014-12-19 16:48:42

标签: cakephp orm cakephp-3.0

我正在尝试使用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模型,所以有没有办法在一个查询中执行它?它可能会让我能够动态过滤重复项。

提前致谢, 戴夫

1 个答案:

答案 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);

因此,您只需将代码放在模型中,即可从控制器中调用自定义查找。