CakePHP 3.0中的多关联(OR)查询

CakePHP 3.0中的多关联(OR)查询,cakephp,orm,cakephp-3.0,Cakephp,Orm,Cakephp 3.0,我正在尝试用CakePHP 3.0 beta 3构建一个(或多或少复杂的)查询。我拥有以下实体: 用户归属组 任务属于任何用户(别名为“收件人”) 任务属于同一组 它是一个任务管理系统。可以向特定用户或指定的用户组发布任务 我现在尝试查找属于当前用户或当前用户所属组的任务(与特定用户相关的所有任务)。我已经获得了用户id和用户所属的组列表 我已使用以下代码使其正常工作: $queryOptions = [ 'contain' => [ 'Recipients', '

我正在尝试用CakePHP 3.0 beta 3构建一个(或多或少复杂的)查询。我拥有以下实体:

用户归属组 任务属于任何用户(别名为“收件人”) 任务属于同一组

它是一个任务管理系统。可以向特定用户或指定的用户组发布任务

我现在尝试查找属于当前用户或当前用户所属组的任务(与特定用户相关的所有任务)。我已经获得了用户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));
CakePHP3.0声称有一个复杂的ORM模型,那么有没有一种方法可以在一个查询中执行它呢?它可能会让我能够快速过滤出重复的内容

提前感谢,,
Dave

您需要两个查询的
联合。ORM支持此语句。MySQL在默认情况下实现了它,清除了重复的结果(假设
DISTINCT
),这样您就可以开始了

Cake的文档应适用于您的案例,如下所示:

$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);

因此,您只需将代码放置在模型中,以便从控制器作为自定义查找进行调用。

非常感谢,这非常有帮助。首先,它抱怨两个查询的列数不同,但我使用select()解决了这个问题。然后我遇到了一个奇怪的问题:我无法使contain()在最终结果中同时包含收件人和组关联。使用$tasksForGroup->union($tasksForUser),它只包括用户。将其切换到$tasksForUser->union($tasksForGroup),它只包含组。通过使用union()获得任务ID列表,并对完整的result set.Unions(具有相同类型的相同字段)发出第二个查询,我解决了这个问题。也许这可以解释为什么它会降低你的能量场。一个好的策略就是获取ID并使用它们。