Запрос Doctrine2 возвращает массив вместо коллекции
Я пытаюсь выполнить запрос с помощью doctrine2 и ему нужно вернуть объект коллекции.
Упрощенный фрагмент:
$players = $this->getEntityManager()
->createQueryBuilder()
->select('p')
->from('...\Player', 'p')
->getQuery()
->getResult();
Возвращаемый объект - это массив.
Информация о форматах результатов говорит: "Результатом является либо простой набор объектов (чистый), либо массив, в котором объекты вложены в строки результатов ( смешанные)". На чем зависит тип результата и как я могу получить объект коллекции?
Ответы
Ответ 1
getResult() всегда возвращает массив. Если вам нужна коллекция, вы должны передать массив, возвращаемый getResult() в Doctrine ArrayCollection
например.
use Doctrine\Common\Collections;
$result = $this->getEntityManager()
->createQueryBuilder()
->select('p')
->from('...\Player', 'p')
->getQuery()
->getResult();
$players = new Collections\ArrayCollection($result);
Ответ 2
Поскольку вы выбираете только объекты "p" (а не отдельные столбцы или значения совокупности), и вы используете getResult() для режима гидратации, ваш запрос должен возвращать чистые объекты, а не массив.
Мое лучшее предположение заключается в том, что проблема связана с синтаксисом сокращения, который вы используете для построения запроса. Первое, что я попробую, это написать запрос "длинная форма" следующим образом:
$em = $this->getEntityManager();
$qb = $em->createQueryBuilder();
$qb->select('p')
->from('...\Player', 'p');
$query = $qb->getQuery();
$players = $query->getResult();
Я бы догадался, что ваш стенографический подход будет прекрасен, но я нашел Доктрину как-то изящным, когда речь заходит о цепочке методов.
Есть несколько других вещей, которые следует учитывать в зависимости от того, насколько упрощен ваш фрагмент. Но, по моему опыту, запрос, записанный как показано, вернет объекты Player.
Ответ 3
чтобы вернуть объект вместо массива, вы должны использовать "Частичные объекты".
здесь приведен пример кода проверки fooobar.com/info/215987/...