Сортировать @OneToMany ArrayCollection доктрины по полю - PullRequest
1 голос
/ 10 апреля 2019

Закрыть вопрос был введите описание ссылки здесь но мне нужно более глубокую сортировку:

/**
 * @var ArrayCollection[SubjectTag]
 *
 * @ORM\OneToMany(targetEntity="SubjectTag", mappedBy="subject")
 * @ORM\OrderBy({"position" = "ASC"})
 * @Assert\Valid()
 */
protected $subjectTags;

В subjectTag у меня есть:

/**
 * @var ArrayCollection[tag]
 *
 * @ORM\OneToMany(targetEntity="Tag", mappedBy="subject")
 * @ORM\OrderBy({"name" = "ASC"})
 * @Assert\Valid()
 */
protected $tags;

Теперь я хочусортировать по SubjectTag.tags.Как я могу это сделать?

РЕДАКТИРОВАТЬ:

Entity1.php: / ** * @ORM \ ManyToOne (targetEntity = "Entity2", referencedColumnName = "id", nullable = false) *@Assert \ Valid () * / protected $ entity2;

Entity2.php: / ** * @ORM \ ManyToOne (targetEntity = "Entity3", referencedColumnName = "id", nullable = false) * @Assert\ Valid () * / protected $ entity3;

Entity3.php:

/**
 * @ORM\Column(type="integer", nullable=true)
 */
protected $position;

А теперь .. Я хочу, чтобы в Entity1 Entity2 сортировались по позиции.Как я могу сделать это по умолчанию?

1 Ответ

1 голос
/ 10 апреля 2019

Как объяснено в моем предыдущем комментарии, вы должны выполнить пользовательский запрос в вашем классе репозитория, соответствующий вашему базовому объекту (вы не дали его имя).

То есть в вашем App \ Repository \Класс репозитория "YourBaseENtityName", вы делаете что-то вроде этого.

public function findOrderByTags()
{
    return $this
        ->createQueryBuilder('baseEntityAlias')
        ->addSelect('st')
        ->addSelect('t')
        ->leftJoin('baseEntityAlias.subjectTags', 'st')
        ->leftJoin('st.tags', 't')
        ->orderBy('st.position', 'ASC')
        ->addOrderBy('t.name', 'ASC')
        ->getQuery()
        ->getResult();
}

Более того, я не уверен, какой порядок вы хотите выполнить, основываясь на вашем вопросе.Здесь baseEntity-> subjectTags будут упорядочены по их позициям, а затем теги baseEntity-> subjectTags-> будут упорядочены по имени.

Теперь вы можете вызывать этот метод из своего класса репозитория базовых сущностей

Надеюсь, это будет полезно для вас.


РЕДАКТИРОВАТЬ: Вот способ ввести поведение по умолчанию для вашего queryBuilder и использовать его повторно.

/**
 * In your EntityRepository add a method to init your query builder
 */
public function createDefaultQueryBuilder(string $alias = 'a')
{
    return $this
        ->createQueryBuilder($alias)
        ->addSelect('st')
        ->addSelect('t')
        ->leftJoin('baseEntityAlias.subjectTags', 'st')
        ->leftJoin('st.tags', 't')
        ->orderBy('st.position', 'ASC')
        ->addOrderBy('t.name', 'ASC');
}

/**
 * In this example, I override the default find method. I don't recommend it thought
 */
public function find($id, $lockMode = null, $lockVersion = null)
{
    return $this
        ->createDefaultQueryBuilder()
        ->where('a.id = :id')
        ->setParameter('id', $id)
        ->getQuery()
        ->getOneOrNullResult();
}

Как вы можете видетьЯ повторно использую метод createDefaultQueryBuilder, чтобы получить поведение по умолчанию с субъектом-тегами и тегами init в отношении, упорядоченными в правильном порядке.

...