Doctrine2 w /同一个表中的子实体

时间:2014-05-08 19:17:23

标签: php mysql symfony doctrine-orm

我有一个数据库表,通常(因为NDA)具有以下结构:

Category:
id(int)    parent_id(int)    title(string)    description(text)

请注意,我无法更改表的架构,因此这不是我问题的可能解决方案。

我需要能够获得所有这些类别的信息,包括他们所有孩子的列表,但我不太确定如何做到这一点。我很确定我需要使用递归,但我不确定Doctrine中是否有任何可以帮助它的东西,或者我是否需要编写原始DQL甚至是SQL。我目前在Symfony控制器中有以下内容:

$em = $this->get('doctrine')->getManager();

$categoryQuery = $em->getRepository('Acme\MyBundle\Entity\Category')->findBy(array(), array('sortPosition' => 'asc'));
$categories = array();

foreach ($categoryQuery as $category) {
        $categories[] = array(
            'id' => $category->getId(),
            'parent' => $category->getParent(),
            'title' => $category->getTitle(),
            'description' => $category->getDescription(),
        );
}

还有另一个问题:我需要以JSON格式输出此信息。

最终,我不确定

一个。如何创建一个查询,它将为我提供一个类别所有子信息(可以有更多孩子)

B中。然后如何将该信息输出为JSON

非常感谢任何想法

2 个答案:

答案 0 :(得分:1)

如果您有类别<>在学说中定义的类别关系:

$categoryQuery = $em->getRepository('Acme\MyBundle\Entity\Category')
  ->createQueryBuilder('c')
  ->leftJoin('c.subCategories sc') // assuming your category <> category relation is called "subCategories
  ->getQuery()
  ->getResult()
  ;

然后在$ categoryQuery的每个记录中,你将有一个类别及其子项 - &gt; subCategories(你真的不需要在那里加入)

如果您没有在学说中定义关系,那么:

$query = $em->createQuery(
    'SELECT c
    FROM AcmeMyBundle:Category c
    LEFT JOIN AcmeMyBundle:Category sc on sc.parent_id = c.id
    ORDER BY sortPosition ASC'
);

$categories = $query->getResult();

将它们作为JSON返回

return new JSONResponse($categories); 

答案 1 :(得分:1)

一个。没有路径,递归选择是......很难/不可能。

请参阅:MySQL parent children one query selection

B中。您可以在Symfony2中使用它:

Symfony\Component\HttpFoundation\JsonResponse