Я пытаюсь персонализировать запрос репозитория 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 - пользовательское отношение "многие ко многим", если вы это имеете в виду.
Нет, подумал я, поля. Идентификатор, имя и что еще? Возможно, добавьте код с обоими классами сущностей, чтобы мы могли проверить, что не так. В настоящее время глядя на ваш код, все, кроме -> addSelect, кажется нормальным. Также вы уверены, что вам нужен -> leftJoin в вашем примере :)? Со многими ко многим обычно это внутреннее соединение, чтобы получить необходимые элементы для некоторого идентификатора
Нет, это обязательно должен быть leftJoin, поскольку innerJoin удаляет некоторые записи без пользователя. В сущностях нет ничего особенного: простой класс без расширений и простые частные поля, такие как id, name, status ... и общедоступные методы. Аналогичная проблема возникает и с другими полями, соединяющими объекты.
Для меня в 2.4 вам не нужно указывать select, чтобы получить все данные пользователя, просто добавьте свое соединение, но я не знаю, как работает getArrayResult ().
getArrayResult () не будет возвращать связанные объекты, в результате чего получается плоская структура. Изменение его на getResult () позволит вам возвращать и проверять всю сущность и связанные с ней данные. Разве это то, что вы хотите? Декартово произведение нескольких соединений?
@NeilMasters Мне жаль сообщать вам, что с помощью getResult я получаю такой же плоский результат. Я получаю только идентификатор вместо всех пользовательских данных.






измените это:
->select('ca.id, ca.name')
к этому:
->select('ca')
Готово, но это не решает проблему. Результат - [ { 0: { id:1, name:"Some name" }, 'users': 1}, { }...]
Вы пробовали удалить кеш? А внутри сущности есть какая-то политика исключения? @ Вандервалс
Я очистил кеш, а также проверил результат dump () вместо сериализованного значения. Проблема уже существует.
Вы пробовали addSelect ('user') или -> leftJoin ('ca.users', 'users') и addSelect ('users')
@ RamazanApaydın да, и эта ошибка отображается: Cannot select entity through identification variables without choosing at least one root entity alias
Это работает для меня:
$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'). Он возвращает весь экземпляр при каждом соединении, чего я пытаюсь избежать.
Надеюсь, это будет вам полезно.
$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.
не стесняйтесь задавать любые вопросы по этому поводу.
Какое поле содержит ваша пользовательская сущность?