【问题标题】:Tricky query with Doctrine querybuilder使用 Doctrine 查询构建器的棘手查询
【发布时间】:2012-08-18 12:28:15
【问题描述】:

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

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

【问题讨论】:

    标签: php sql symfony doctrine


    【解决方案1】:

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

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

    我不清楚您是如何存储权限的,但在查询中您可以“或”一起使用 where 条件并检查层次结构中的每个项目。

    【讨论】:

    • 聪明,有没有按层级排序的方法?
    • 获得数据后,我将使用 jQuery 重构表单。这样更容易。
    猜你喜欢
    • 2016-01-12
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多