Я делаю довольно большой проект Symfony2 (к сожалению, в базе данных, структуру которой я не могу изменить), и я застрял на этом:
У меня есть объект User, который содержит (среди других полей) поле имени пользователя.
У меня также есть объект ProfileField, который соответствует дополнительным полям для пользователя (например, имя или фамилия, любимый цвет или что-то еще, о чем вы хотели бы спросить пользователя).
Наконец, есть ConfigService, который в основном получает определенное значение для определенного ключа из базы данных. В этом конкретном случае все дело в небольшом значении конфигурации, называемом «username_format». Он может принимать одно из трех значений: «имя пользователя», «имя» или «имя и фамилия».
В зависимости от этого значения мне нужно отобразить правильно отформатированное имя пользователя. Если значение равно «имя пользователя» - я просто возвращаю значение поля имени пользователя из объекта «Пользователь». Как для 2-го, так и для 3-го случая, поэтому, когда мне нужно получить пользовательский ProfileField, соответствующий этому конкретному пользователю, я создал простую службу (называемую usernameFormatService), в которую вводится ConfigService и метод с именем getNameFromId($userId). Метод проверяет значение конфигурации и извлекает правильные значения для правильного пользователя. Все это работает очень хорошо, но...
У меня есть обзорная страница блога, на которой отформатированное имя пользователя отображается среди других полей (таких как заголовок, дата создания и т. д.). Сущность Blog имеет связь manyToOne с сущностью User. Из сопоставления я, конечно, получаю имя пользователя, и если значение конфигурации «username_format» говорит, что мне нужно, например, имя, я вытаскиваю его с помощью usernameFormatService внутри шаблона Twig, и все работает так, как должно.
Настоящая проблема начинается, когда мне нужно иметь возможность сортировать по каждому столбцу, что означает также отформатированный столбец имени пользователя. Я использую Doctrine QueryBuilder для получения результатов БД, и в основном мне нужно отформатированное значение имени пользователя где-то внутри объекта пользователя (я думаю), чтобы иметь возможность сортировать блоги по этому значению ДО того, как они будут извлечены из базы данных (почему раньше? разбиение на страницы).
Может ли кто-нибудь дать мне хотя бы подсказку, где искать или как это сделать?
Обновление:
Чтобы было понятнее, может быть:
Прямо сейчас имя пользователя, отображаемое в обзорной таблице, обрабатывается usernameFormatService, который использует ConfigService для получения значения конфигурации «platform_username_format» из базы данных и, в зависимости от этого значения конфигурации, возвращает отформатированное имя пользователя. Если дело доходит до сортировки, мне нужно каким-то образом получить это отформатированное имя пользователя ДО того, как я на самом деле буду запрашивать базу данных, чтобы я мог получить отсортированные результаты.