Doctrine:使用子查询生成树路径

时间:2016-11-17 06:28:25

标签: php mysql doctrine symfony

我尝试使用闭包表生成类别路径。但据我所知,我在将查询转换为DQL时遇到问题,因为学说并不支持子查询。有没有办法做到这一点或任何其他解决方法?

类别表: -

id    name          slug

1     Category A    category-a
2     Category B    category-b
3     Category C    category-c

category_closure表: -

ancestor_id    descendant_id    path_length

4              4                0
4              44               1
4              53               2
44             44               0
44             53               1
53             53               0

期望的结果: -

id    name         path

3     Category C   category-a/category-b/category-c

SQL已执行: -

SELECT c.id, c.name, tmp.path
FROM category c
INNER JOIN (
    SELECT a.descendant_id, group_concat( c1.slug
    ORDER BY a.path_length DESC
    SEPARATOR '/' ) AS path
    FROM category c1
    JOIN category_closure a ON c1.id = a.ancestor_id
    WHERE a.descendant_id = 3
) tmp ON c.id = tmp.descendant_id

我的学说协会如下: -

AppBundle\Entity\Category:
    type: entity
    table: category
    repositoryClass: AppBundle\Repository\CategoryRepository
    oneToMany:
        closure:
            targetEntity: CategoryClosure
            mappedBy: category

AppBundle\Entity\CategoryClosure:
    type: entity
    table: category_closure
    manyToOne:
        category:
            targetEntity: Category
            inversedBy: closure
            joinColumn:
                name: descendant_id
                referencedColumnName: id
  1. 我的查询是否已优化?
  2. 如何使用doctrine编写此查询?
  3. 非常感谢任何帮助。感谢

1 个答案:

答案 0 :(得分:0)

您可以使用DoctrineExtensions - >树构建闭包并利用存储库方法。 https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/tree.md#repository-methods。 我也鼓励你们看看来源。

其他解决方案是使用doctrine本机查询。 另一个解决方案是在实体管理器对象上进行纯连接。