Как получить класс вместо массива в Doctrine 2
Я могу извлечь мои данные из базы данных, используя эту структуру:
$user = $this->getDoctrine()
->getRepository('AcmeDemoBundle:Emails')
->find(8081);
Когда я это сделаю, я могу получить свои данные следующим образом:
$user->getColumnNameHere();
В основном я могу использовать класс Entity.
Но если я хочу использовать QueryBuilder вместо find
, я получаю ассоциативные массивы.
$product->createQueryBuilder('p')
->setMaxResults(1)
->where('p.idx = :idx')
->select('p.columnNameHere')
->setParameter('idx', 8081)
->orderBy('p.idx', 'DESC')
->getQuery();
$product = $query->getResult();
$product returnds как массив. Можно ли получить его с помощью класса Entity Managaer? Если да, то как?
Я документирую документацию, но кажется, что это невозможно или не существует в документе или я просто слепой:)
Ответы
Ответ 1
Да, вы можете, обычно используя:
$repository
->createQueryBuilder('p')
->getQuery()
->execute()
;
Это должно вернуть вам массив объектов.
Если вы хотите получить результат одного объекта, используйте либо getSingleResult
, либо getOneOrNullResult
:
$repository
->createQueryBuilder('p')
->getQuery()
->getOneOrNullResult()
;
Предупреждение. Этот метод может потенциально бросить NonUniqueResultException
.
Изменить: Хорошо, поэтому вопрос касался частичных объектов: http://docs.doctrine-project.org/en/latest/reference/partial-objects.html
Ответ 2
вы можете получить объект вместо массива, используя "Частичные объекты".
здесь приведен пример с Doctrineorm 2.2.2:
// create query builder
// $em is the EntityManager
$qb = $em->createQueryBuilder();
// specify the fields to fetch (unselected fields will have a null value)
$qb->select ('partial p.{id,pubDate,title,summary}')
->from ('Project\Entity\Post', 'p')
->where ('p.isActive = 1')
->orderBy ('p.pubDate', 'desc');
$q = $qb->getQuery();
$result = $q->getResult();
var_dump($result); // => object
Ответ 3
Если вы хотите вернуть объект из исходного запроса:
$product->createQueryBuilder('p')
->setMaxResults(1)
->where('p.idx = :idx')
->select('p.columnNameHere')
->setParameter('idx', 8081)
->orderBy('p.idx', 'DESC')
->getQuery();
$product = $query->getResult();
Удалить эту строку
->select('p.columnNameHere')
Как только вы используете select, он вернет массив...
Ответ 4
getResult()
метод возвращает коллекцию (массив) объектов. Используйте getSingleResult()
, если вы собираетесь извлечь только один объект.
EDIT:
О, я просто заметил, что вы хотите получить одно поле одного объекта. Используйте getSingleScalarResult()
, как предлагает @Florian.