Сложный запрос с помощью 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')
Мне не ясно, как у вас хранятся ваши разрешения, но внутри запроса вы можете "или" вместе, где условия, и проверить каждый элемент в иерархии.