Подтвердить что ты не робот

Как получить класс вместо массива в 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? Если да, то как?

Я документирую документацию, но кажется, что это невозможно или не существует в документе или я просто слепой:)

4b9b3361

Ответ 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.