简体   繁体   中英

Doctrine: Generate a tree path using a sub-query

I'm trying to generate a category path using a closure table. But I'm having a problem converting my query into DQL as doctrine doesn't support sub-queries, as far as I know. Is there a way to do it or any other workaround?

category table :-

id    name          slug

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

category_closure table :-

ancestor_id    descendant_id    path_length

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

Desired result :-

id    name         path

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

SQL executed :-

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

My doctrine associations are as follows:-

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. Is my query optimized?
  2. How to write this query using doctrine?

Any help is greatly appreciated. Thanks

You can use DoctrineExtensions -> tree to build closure and take advantage of repository methods. https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/tree.md#repository-methods . I encourage you also to take a look at the source.

Other sollution is to use doctrine native query. Another sollution is to operate on pure connection on entity manager object.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM