Doctrine DQL - выберите псевдоним столбца, добавленный как новая запись

У меня есть объект пользователя, связанный с объектом профиля пользователя.

Мне нужно объединить имя и фамилию пользователей для целей фильтрации.

Примерно так выглядит мой запрос:

$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, получено '.'

Как правильно это сделать?

Спасибо

Вы хотите сопоставить fullName в запросе или позже в PHP?

lxg 10.08.2018 10:29

Используйте собственный запрос вместо этого, затем сопоставьте поле со свойствами класса с помощью ResultSetMapping.

emix 10.08.2018 10:40

lxg: Да, мне нужно будет найти соответствие в запросе.

Sodium 10.08.2018 11:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
3
2 686
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Почему бы вам не предоставить весь список необходимых столбцов в методе выбора:

    ->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 по умолчанию и возвращать коллекции сущностей. Есть ли способ это сделать?

Sodium 10.08.2018 11:17

Если вы предпочитаете возвращать коллекцию entites, нет простого способа сопоставить настраиваемое свойство базы данных с результатом сущности.

Kamil Adryjanek 10.08.2018 11:34

Хорошо, я думаю, проще всего добавить условие where с объединенными значениями вместо загрузки его как дополнительного поля. Спасибо за вашу помощь.

Sodium 10.08.2018 11:42

Другие вопросы по теме