Как получить только идентификатор объекта с помощью Symfony QueryBuilder?

Я пытаюсь персонализировать запрос репозитория symfony 2.4, чтобы получить только некоторые поля. С плоскими полями все в порядке, но при получении полей сущности я получаю только идентификатор (по умолчанию), но не все данные сущности. Мой запрос:

    $select = $this->createQueryBuilder('ca')
    ->select('ca.id, ca.name')
    ->leftJoin('ca.users', 'user')
    ->addSelect('(user) as users'); 

    $select->setMaxResults($count);

    return $select->getQuery()->getResult();

Результат: [{id: 1, name: "Some name", users: 1}, ...]

Как я могу изменить этот запрос, чтобы пользователи содержали все пользовательские данные, такие как идентификатор, имя, адрес и т. д.?

Какое поле содержит ваша пользовательская сущность?

revengeance 31.05.2018 12:39

@revengeance - пользовательское отношение "многие ко многим", если вы это имеете в виду.

Vandervals 31.05.2018 12:47

Нет, подумал я, поля. Идентификатор, имя и что еще? Возможно, добавьте код с обоими классами сущностей, чтобы мы могли проверить, что не так. В настоящее время глядя на ваш код, все, кроме -> addSelect, кажется нормальным. Также вы уверены, что вам нужен -> leftJoin в вашем примере :)? Со многими ко многим обычно это внутреннее соединение, чтобы получить необходимые элементы для некоторого идентификатора

revengeance 31.05.2018 12:51

Нет, это обязательно должен быть leftJoin, поскольку innerJoin удаляет некоторые записи без пользователя. В сущностях нет ничего особенного: простой класс без расширений и простые частные поля, такие как id, name, status ... и общедоступные методы. Аналогичная проблема возникает и с другими полями, соединяющими объекты.

Vandervals 31.05.2018 12:58

Для меня в 2.4 вам не нужно указывать select, чтобы получить все данные пользователя, просто добавьте свое соединение, но я не знаю, как работает getArrayResult ().

Charlie Lucas 05.06.2018 10:24

getArrayResult () не будет возвращать связанные объекты, в результате чего получается плоская структура. Изменение его на getResult () позволит вам возвращать и проверять всю сущность и связанные с ней данные. Разве это то, что вы хотите? Декартово произведение нескольких соединений?

Neil Masters 07.06.2018 14:37

@NeilMasters Мне жаль сообщать вам, что с помощью getResult я получаю такой же плоский результат. Я получаю только идентификатор вместо всех пользовательских данных.

Vandervals 08.06.2018 10:45
Стоит ли изучать 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 и хотите разрабатывать...
6
7
2 386
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

измените это:

->select('ca.id, ca.name')

к этому:

->select('ca')

Готово, но это не решает проблему. Результат - [ { 0: { id:1, name:"Some name" }, 'users': 1}, { }...]

Vandervals 31.05.2018 12:10

Вы пробовали удалить кеш? А внутри сущности есть какая-то политика исключения? @ Вандервалс

Alessandro Minoccheri 31.05.2018 12:16

Я очистил кеш, а также проверил результат dump () вместо сериализованного значения. Проблема уже существует.

Vandervals 31.05.2018 12:18

Вы пробовали addSelect ('user') или -> leftJoin ('ca.users', 'users') и addSelect ('users')

Ramazan APAYDIN 31.05.2018 12:38

@ RamazanApaydın да, и эта ошибка отображается: Cannot select entity through identification variables without choosing at least one root entity alias

Vandervals 31.05.2018 12:44
Ответ принят как подходящий

Это работает для меня:

$select = $this->createQueryBuilder('ca')
    ->select('partial ca.{id, name}, users')
    ->leftJoin('ca.users', 'users');

$select->setMaxResults($count);

return $select->getQuery()->getArrayResult();

Вы должны попробовать этот способ. Вы можете использовать Partial.

$select = $this->createQueryBuilder('ca')
->select('partial ca.{id, name}')
->leftJoin('ca.users', 'users')
->addSelect('users'); 

Подробное описание этой проблемы доступно здесь. Doctrine2: Невозможно выбрать объект через идентификационные переменные, не выбрав хотя бы один псевдоним корневого объекта.

Этот результат такой же, как при выполнении только $select = $this->createQueryBuilder('ca'). Он возвращает весь экземпляр при каждом соединении, чего я пытаюсь избежать.

Vandervals 08.06.2018 10:48

Надеюсь, это будет вам полезно.

$qb = $this->em->createQueryBuilder();
        $qb->select('o.id as order_id,o.createdBy as created_by,o.user as user_id');
        // for getting selective fields
        //$qb->select('o');        
        //for getting all fields in certain table
        $qb->from('Entity\Orders', 'o');
        $qb->setMaxResults(1); 
        // for getting single record only.
        return $qb->getQuery()->getOneOrNullResult(); 
        // for getting single record or null record.
        //return $qb->getQuery()->getResult(); 
        // for getting multiple records.  

не стесняйтесь задавать любые вопросы по этому поводу.

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