使用Symfony2 / YML在Doctrine中订购(子)类别

时间:2015-02-05 18:00:50

标签: php symfony doctrine-orm

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

表"类别"

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 个答案:

答案 0 :(得分:1)

您的树深度可能会> 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 %}