Близкий вопрос был введите сюда описание ссылки, но мне нужна более глубокая сортировка:
/**
* @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) * @Утверждение\Действительно() */ защищенный объект $entity2;
Entity2.php: /** * @ORM\ManyToOne(targetEntity="Entity3", referencedColumnName="id", nullable=false) * @Утверждение\Действительно() */ защищенный объект $entity3;
Entity3.php:
/**
* @ORM\Column(type = "integer", nullable=true)
*/
protected $position;
А теперь .. Я хочу иметь в Entity1 Entity2 отсортированные по положению. Как я могу сделать это по умолчанию?
@FlorianHermann, не могли бы вы привести пример с этими пользовательскими запросами и запустить его в сущности? или может я что-то не так понимаю?




Как объяснялось в моем предыдущем комментарии, вы должны выполнить собственный запрос в своем классе репозитория, соответствующем вашей базовой сущности (вы не указали его имя).
Итак, в вашем классе App\Repository\"YourBaseENtityName"Repository вы делаете что-то вроде этого.
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, чтобы получить поведение по умолчанию с subjectTags и тегами, инициализированными в отношении и упорядоченными в правильном порядке.
Но теперь мне нужно сделать $entity->findOrderByTags(), чтобы отсортировать все теги по положению, верно? Разве я не могу просто отсортировать сущности? Я имею в виду, что если я получу список сущностей, мне нужно сделать foreach, а затем заменить теги в сущности на то, что я получаю от findOrderByTags?
может быть, мне нужно только установить порядок по умолчанию для объекта? Является ли это возможным?
Для этого нет способа получить поведение по умолчанию. Я рекомендую вам делать только настраиваемый запрос в вашем EntityRepository и использовать для него метод для вашего поведения по умолчанию. Я отредактирую этот ответ, чтобы показать вам, как это сделать.
Спасибо, но, как вы упоминаете в ответе, переопределение метода поиска по умолчанию - это не то, что вы рекомендовали, так что же? :)
Я рекомендую вам не переопределять поиск по умолчанию, а создать свой собственный метод с именем, например, findOneWithDetailsById(int $id) и вызывать только этот. Это ваша ответственность организовать это.
Я предлагаю вам сделать собственный запрос в вашем репозитории, чтобы сделать что-то более гибкое. Эта аннотация позволяет вам быстро получить порядок результатов по свойству, не добавляя subjectTags к исходному результату запроса, но у вас возникнет проблема n+1, если вы все равно захотите упорядочить по $tags. Если вы дадите более подробную информацию, я смогу показать вам, как это сделать, в ответе.