Как объяснено в моем предыдущем комментарии, вы должны выполнить пользовательский запрос в вашем классе репозитория, соответствующий вашему базовому объекту (вы не дали его имя).
То есть в вашем 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 в отношении, упорядоченными в правильном порядке.