使用在Symfony2中具有两个多对多关系的QueryBuilder创建查询

时间:2015-03-01 23:40:40

标签: symfony many-to-many query-builder

大家晚上好!

我在Symfony2中遇到QueryBuilder问题。

用户可以成为某些组的一部分。每个GROUP都可以访问CATEGORIES。这是一个小数据库图表。

Database diagram

现在,我想使用QueryBuilder检索用户的类别,以便通过我的CategoryRepository将结果放入表单中。这是相应的SQL语句(在示例中,我为user_id设置了1,但是它由CategoryRepository中的$user->getId()提供。

SELECT theCategoryObject
FROM category C, category_group CG, group G, user_group UG, user U
WHERE FU.id = 1
AND U.user_id = UG.user_id
AND UG.group_id = G.group_id
AND CG.group_id = G.group_id
AND CG.category_id = C.category_id

我尝试使用EXISTS和MEMBER OF但它不会过滤任何东西。

public function findByUserQueryBuilder(User $user)
{
    $qb = $this->createQueryBuilder('c');
    $qb->where('c.isSelectionable = true');

    foreach ($user->getGroups() as $group)
    {
        $qb->andWhere('EXISTS (SELECT ' . $group->getId() . ' FROM ISIMA\Bundle\UserBundle\Entity\Group g' . $group->getId() . ' WHERE g' . $group->getId() . ' MEMBER OF c.groups)');
    }
    return $qb;
}

感谢您将来的答案!

1 个答案:

答案 0 :(得分:0)

最后,我找到了解决方案!我忘了定义组ID并在用户是多个组的一部分时放置Or条件。

public function findByUserQueryBuilder(User $user)
{
    $qb = $this->createQueryBuilder('c');
    $qb->where('c.isSelectionable = true')

    $i = 0;
    foreach ($user->getGroups() as $group)
    {
        $query = 'EXISTS (SELECT 1 FROM ISIMA\Bundle\UserBundle\Entity\Group g' . $group->getId() . ' WHERE g' . $group->getId() . '.id = ' . $group->getId() . ' AND g' . $group->getId() . ' MEMBER OF c.groups)';
        if($i == 0)
        {
            $qb->andWhere($query);
            $i = 1;
        }
        else
        {
            $qb->orWhere($query);
        }
    }
    return $qb;
}