У меня есть объект пользователя, связанный с объектом профиля пользователя.
Мне нужно объединить имя и фамилию пользователей для целей фильтрации.
Примерно так выглядит мой запрос:
$qb = $this->createQueryBuilder('users');
$qb
->addSelect('users')
->innerJoin('users.profile', 'profile')
->addSelect('profile')
->addSelect('CONCAT(profile.firstName, \' \', profile.lastName) AS fullName')
;
Я бы ожидал, что полное имя будет рассматриваться как свойство или профиль пользователя, но вместо этого я получаю полное имя как совершенно новую запись в результатах:
[0] => Array (
[id] => 5
[username] => admin
[profile] => Array (
[firstName] => John
[lastName] => Doe
)
),
[fullName] => John Doe
Я попытался присвоить столбцу псевдоним «users.fullName», но это дало мне ошибку.
[Синтаксическая ошибка] строка 0, столбец 87: Ошибка: ожидаемая Doctrine \ ORM \ Query \ Lexer :: T_FROM, получено '.'
Как правильно это сделать?
Спасибо
Используйте собственный запрос вместо этого, затем сопоставьте поле со свойствами класса с помощью ResultSetMapping.
lxg: Да, мне нужно будет найти соответствие в запросе.






Почему бы вам не предоставить весь список необходимых столбцов в методе выбора:
->select('user.id, user.username, CONCAT(profile.firstName, \' \', profile.lastName) AS fullName')
И вы должны получить правильный массив ассоциаций.
Не забудьте добавить соответствующее предложение where:
->where("CONCAT(profile.firstName, ' ', profile.lastName) LIKE :name")
->setParameter('name', '%' . $name . '%')
Спасибо за ваш отзыв. Хотя это действительно работает, в идеале я бы предпочел сохранить поведение Doctrine по умолчанию и возвращать коллекции сущностей. Есть ли способ это сделать?
Если вы предпочитаете возвращать коллекцию entites, нет простого способа сопоставить настраиваемое свойство базы данных с результатом сущности.
Хорошо, я думаю, проще всего добавить условие where с объединенными значениями вместо загрузки его как дополнительного поля. Спасибо за вашу помощь.
Вы хотите сопоставить
fullNameв запросе или позже в PHP?