Я часто сортирую связанные сущности по внешнему атрибуту, и мне интересно, как лучше всего справиться с этим и при этом иметь возможность использовать коллекции основной сущности. Давайте иметь этот пример:
Author { $name, Comment[] $comments}
Comment { $name, Category $category}
Category { $name, $position }
я хочу $author->getComments()
отсортировано по позиции в категории комментариев. С точки зрения DQL:
SELECT com.* FROM comment com JOIN com.category cat ORDER BY cat.position
По правде говоря, мои критерии сортировки довольно сложны, это только начало.
Я знаю об аннотации @OrderBy для ассоциаций * ToMany, но она мне не поможет, поскольку упорядочение по атрибуту объединенной таблицы не поддерживается.
Я также знаю, что могу использовать DQL для получения комментариев, но мне нужно получить к ним доступ во многих местах, и я бы предпочел ссылки $author->getComments()
вместо того, чтобы звонить $commentRepository->findByAuthorSorted($author)
, Я не хочу, чтобы мне пришлось вызывать мой пользовательский метод для правильного выбора комментариев. Я хочу, чтобы это было автоматически.
Я думал о том, чтобы как-то передать commentRepository объекту Author и использовать его в getComments()
но я не понял, как это сделать, к тому же с самого начала это нехорошо.
Я также думал о выполнении сортировки в PHP в getComments()
, Я не думаю, что я могу использовать Criteria
+ $author->comments->matching()
потому что объединенные атрибуты не поддерживаются. Я в порядке с преобразованием коллекции в массив только для чтения, но я надеюсь, что есть лучшее, более подходящее для Doctrine решение.
Я не хочу обходить проблему, добавляя $categoryPosition
для каждого Comment
,
Я хотел бы услышать, как вы, люди, решаете эту проблему. Бьюсь об заклад, я не одинок 🙂
Задача ещё не решена.
Других решений пока нет …