使用Doctrine querybuilder进行巧妙的查询


Tricky query with Doctrine querybuilder

我有一个棘手的查询问题,我用这段代码提取用户可以访问的容器(以多对多关系定义的访问):

    //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中,我不能像这样深入挖掘级别,是吗?

您可以在查询中提取完整的层次结构:

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

我不清楚你是如何存储权限的,但在查询中,你可以"或"一起检查继承权中的每个项目。