使用 Symfony2/YML 在 Doctrine 中排序(子)类别

Order (sub-)categories in Doctrine with Symfony2/YML

我终于在 Doctrine/Symfony2 中成功创建了一个有效的自引用关系。但是,当我请求 findAll 时,table 行没有按我想要的顺序返回。 (也许这不是那么容易,但我再也找不到任何解决方案了。)

table "categories"

id    parentId    name
1     NULL         music
2     NULL         films
3     1            bands
4     1            guitars
5     NULL         books
6     2            actors

文件"category.orm.yml"

FormBundle\Entity\Category:
    type: entity
    oneToMany:
        children:
            fetch: "EAGER"
            targetEntity: FormBundle\Entity\Category
            mappedBy: parent
            cascade: ["all"]
    manyToOne:
        parent:
            targetEntity: FormBundle\Entity\Category
            inversedBy: children
            joinColumn:
                name: parentId
                referencedColumnName: id
    table: categories
    repositoryClass: FormBundle\Entity\CategoryRepository
    id:
        id:
            column: id
            type: integer
            id: true
            generator:
                strategy: AUTO
    fields:
        name:
            type: string
            length: '100'
    lifecycleCallbacks: {  }

我尝试了 orderBy(以我能找到的任何方式,在任何领域),但我没有成功,也没有取得任何进展。

实体文件"Category.php"

<?php

namespace FormBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * Category
 */
class Category
{
    /**
     * @var integer
     */
    private $id;

    /**
     * @var category
     */
    private $parent;


    /**
     * @var arrayCollection
     */
    private $children;

    /**
     * @var string
     */
    private $name;

    public function __construct()
    {
        $this->children = new ArrayCollection();
    }

    public function getChildren() {
        return $this->children;
    }


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set parentId
     *
     * @param integer $parentId
     * @return Category
     */
    public function setParent(Category $parent)
    {
        $this->parent = $parent;

        return $this;
    }

    /**
     * Get parentId
     *
     * @return integer
     */
    public function getParent()
    {
        return $this->parent;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return Category
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

}

我想要的输出

<b>music</b>
bands
guitars
<b>films</b>
actors
<b>books</b>

这将是一个列表,但我们现在不要担心!是关于订单的!

我的问题

我应该在我的控制器中放入什么来使用关系并按我想要的顺序获取行?甚至更好;我应该在控制器和存储库中放入什么?

我不想使用 DQL,因为那不是 Doctrine 的用途。我想学习 Doctrine,这似乎是一件非常好的事情。是的,我已经阅读了几天的文档,但似乎对我没有任何作用。也许我忽略了什么。

您的树深度可能 > 1,Doctrine extensions 和他的 Tree-NestedSet 将是一个不错的选择。如果不是这样,你的问题就变得微不足道了:

在你的控制器中:

$parentCategories = $categoryRepository->findBy(array('parent' => null));
return $this->render('path_to_your_view.html.twig', array(
    'parentCategories' => $parentCategories
));

在您看来:

{% for parentCategory in parentCategories %}
    <b>{{ parentCategory.getName() | e }}</b>
    {% for childCategory in parentCategory.getChildren() %}
        <p>{{ childCategory.getName() | e }}</p>
    {% endfor %}
{% endfor %}