Сложный запрос с помощью Doctrine

У меня сложная проблема с запросом, я использую этот код для извлечения контейнеров, к которым у пользователя есть доступ (доступ определен в отношении многих ко многим):

    //Fetch the containers
    $repository = $this->getDoctrine()->getRepository('BizTVContainerManagementBundle:Container');
    $query = $repository->createQueryBuilder('c')
        ->innerJoin('c.users','u')
        ->where('c.company = :company')
        ->setParameter('company', $companyId)
        ->orderBy('c.name', 'ASC')
        ->getQuery();
    $containers = $query->getResult();

Теперь у меня фактически есть иерархия из 4 уровней разрешений - компания, географическая зона, здание и экран. Мне бы хотелось, чтобы он был настроен таким образом, чтобы, когда у пользователя были разрешения на родительский объект, запрос также возвращал дочерний объект, без каких-либо особых разрешений на дочерний объект.

Если бы у меня был доступ к превосходной системе сущностей symfony2, я мог бы поставить что-то вроде

If $entity->getParent() == granted
OR
$entity->getParent()->getParent() == granted
THEN
this is granted also

но в SQL я не могу копаться в таких уровнях, не так ли?

1 ответ

Решение

Вы можете получить полную иерархию в вашем запросе:

$query = $repository->createQueryBuilder('company')
    ->leftJoin('company.parent','geoarea')
    ->leftJoin('geoarea.parent','building')
    ->leftJoin('building.parent','screen')

Мне не ясно, как у вас хранятся ваши разрешения, но внутри запроса вы можете "или" вместе, где условия, и проверить каждый элемент в иерархии.

Другие вопросы по тегам