我有一个数据库表,通常(因为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
非常感谢任何想法
答案 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