大家晚上好!
我在Symfony2中遇到QueryBuilder问题。
用户可以成为某些组的一部分。每个GROUP都可以访问CATEGORIES。这是一个小数据库图表。
现在,我想使用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;
}
感谢您将来的答案!
答案 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;
}