EXPERTS

Форматы результата запроса

Экземпляр класса Doctrine\ORM\Query представляет запрос DQL. Экземпляр Query создается при вызове EntityManager#createQuery($dql), передавая строку запроса DQL. В качестве альтернативы вы можете создать пустой экземпляр Query и впоследствии вызвать Query#setDQL($dql):

// $em - экземпляр EntityManager
$em = $this->getEntityManager();
// передача строки DQL
$query = $em->createQuery(
	'SELECT u
	FROM App\Entity\User u'
);
// возвращает массив объектов User
return $query->getResult();

// альтернативно использовать setDQL
$query = $em->createQuery()
$query->setDQL(
	'SELECT u
	FROM App\Entity\User u'
);

Формат, в котором возвращается результат запроса DQL SELECT, может зависеть от так называемого режима гидратации. Режим гидратации определяет конкретный способ преобразования набора результатов SQL. Каждый режим гидратации имеет свой собственный метод в классе Query.

return $query->getResult()

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

return $query->getSingleResult()

Возвращает один объект. Если результат содержит более одного объекта, генерируется исключение NonUniqueResultException. Если результат не содержит объектов, генерируется исключение NoResultException.

return $query->getOneOrNullResult()

Возвращает один объект. Если результат содержит более одного объекта, генерируется исключение NonUniqueResultException. Если объект не найден, возвращается ноль.

return $query->getArrayResult()

Возвращает граф массива (вложенный массив), который в значительной степени взаимозаменяем с графом объектов, сгенерированным Query#getResult() для целей 'только для чтения'. Граф массива может отличаться от соответствующего графа объектов в определенных сценариях из-за различия семантики тождества между массивами и объектами.

return $query->getScalarResult()

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

return $query->getSingleScalarResult()

Возвращает одно скалярное значение. Если результат содержит более одного скалярного значения, генерируется исключение.


Вместо использования этих методов вы можете альтернативно использовать универсальный метод Query#execute(array $params = array(), $hydrationMode = Query::HYDRATE_OBJECT). Используя этот метод, вы можете напрямую указать режим гидратации в качестве второго параметра через одну из констант запроса. Фактически, методы, упомянутые ранее, являются просто удобными ярлыками для метода execute. Например, метод Query#getResult() внутренне вызывает execute, передавая Query :: HYDRATE_OBJECT в качестве режима гидратации.

Использование методов, упомянутых ранее, обычно предпочтительнее, так как это приводит к более краткому коду.