Как получить коллекцию в результатах запроса Doctrine2 - PullRequest
31 голосов
/ 19 ноября 2011

Я пытаюсь выполнить запрос, используя doctrine2, и мне нужно, чтобы он возвратил объект коллекции.

Упрощенный фрагмент:

$players = $this->getEntityManager()
    ->createQueryBuilder()
    ->select('p')
    ->from('...\Player', 'p')
    ->getQuery()
    ->getResult();

Возвращенный объект - это массив Player.

Информация о форматах результатов запроса говорит:

Результатом является либо простая коллекция объектов (чистая), либо массив, в который объекты вкладываются в результатстроки (смешанные).

От чего зависит тип результата и как можно получить объект коллекции?

Ответы [ 3 ]

58 голосов
/ 23 ноября 2011

getResult () всегда возвращает массив.Если вы хотите коллекцию, вы должны передать массив, возвращаемый getResult (), в ArrayCollection Doctrine

например

use Doctrine\Common\Collections;

$result = $this->getEntityManager()
    ->createQueryBuilder()
    ->select('p')
    ->from('...\Player', 'p')
    ->getQuery()
    ->getResult();

$players = new Collections\ArrayCollection($result);
1 голос
/ 21 августа 2012

чтобы вернуть объект вместо массива, вы должны использовать "Частичные объекты".

здесь тестируется пример кода https://stackoverflow.com/a/12044461/1178870

1 голос
/ 20 ноября 2011

Поскольку вы выбираете только объекты 'p' (а не отдельные значения столбцов или агрегатов) и используете getResult () для режима гидратации, ваш запрос должен возвращать чистые объекты, а не массив.

Мое лучшее предположение состоит в том, что проблема связана с сокращенным синтаксисом, который вы используете для построения запроса.Первое, что я бы попробовал, это написать запрос «длинная форма», подобный следующему:

$em = $this->getEntityManager();
$qb = $em->createQueryBuilder();

$qb->select('p')
   ->from('...\Player', 'p');

$query = $qb->getQuery();
$players = $query->getResult();

Я бы предположил, что ваш сокращенный подход будет в порядке, но я обнаружил, что Doctrine - это своего родапривередливы, когда дело доходит до цепочки методов.

Есть еще несколько вещей, которые следует учитывать в зависимости от того, насколько упрощен ваш фрагмент.Но по моему опыту, запрос, написанный как показано, вернет объекты Player.

...