Порядок (под) категорий в Doctrine с Symfony2 / YML

0

Наконец, мне удалось создать рабочие отношения для ссылок на Doctrine/Symfony2. Но, когда я запрашиваю find, все строки таблицы не возвращаются в том порядке, который я хочу. (Может быть, это не так просто, но я больше не могу найти решение.)

Таблица "категории"

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 предназначен для использования. Я хочу изучить Учение, и это, кажется, очень хорошая вещь, чтобы учиться. Да, я читал документы в течение нескольких дней, но ничего не работает для меня. Может, я что-то упустил.

  • 0
    Доктрина не предназначена для использования с DQL? Никогда не слышал этого раньше. DQL (Doctrine Query Language) является ключевым компонентом Doctrine.
  • 0
    @Cerad Я знал, что это будет неправильно понято, хаха. Но я не знал лучшего способа сказать это. (Все еще трудно найти английский язык) DQL действительно является частью Doctrine. Но с DQL я не думаю, что вы используете все возможности Doctrine, по крайней мере, не то, как Doctrine представляет себя. Это всегда останется ключевым элементом, конечно. Но о продуктивности и моем вопросе ... У вас есть решение или что-то, что может направить меня в правильном направлении?
Показать ещё 2 комментария
Теги:
doctrine2

1 ответ

1
Лучший ответ

Ваша глубина дерева, вероятно, будет> 1, расширения Doctrine с его 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 %}
  • 0
    Я хотел избежать использования расширений, если это возможно, но это, кажется, единственное решение, за исключением использования рекурсивного шаблона ветки для вопросов. Однако пример, приведенный в этом ответе, производит запрошенный вывод и, таким образом, это принятый ответ. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню