Symfony2 直接SQL実行 NativeQuery

Entityを使わないパターン

ResultSetMapping フィールドとマッピングするプロパティを指定するときaddScalarResultを使う

 

      $em = $this->getDoctrine()->getEntityManager();
            $rsm = new ResultSetMapping();
            $rsm->addScalarResult('id', 'id');
            $rsm->addScalarResult('name', 'name');
            $rsm->addScalarResult('count', 'cnt');
            $query = $em->createNativeQuery('
                    SELECT
                     o.id
                    ,name
                    ,(SELECT count(true) FROM table_two t  WHERE t.id = o.id ) AS count
                    FROM table_one o LIMIT ? OFFSET ?', $rsm);
            $query->setParameter(1, $limit);
            $query->setParameter(2, $offset);
            $result = $query->getArrayResult();

 

Entityを使うパターン

ResultSetMapping addEntityResultでエンティティーを指定してあげてフィールドとマッピングするプロパティを指定するときaddFieldResultを使う。上記のようにEntityにないフィールはマッピングすることができない。

      $em = $this->getDoctrine()->getEntityManager();
            $rsm = new ResultSetMapping();
            $rsm->addEntityResult('Acme\HelloBundle\Entity\Post', 'r');
            $rsm->addFieldResult('r', 'id', 'id');
            $rsm->addFieldResult('r', 'name', 'name');
            $query = $em->createNativeQuery('
                    SELECT
                     o.id
                    ,name
                    ,(SELECT count(true) FROM table_two t  WHERE t.id = o.id ) AS count
                    FROM table_one o LIMIT ? OFFSET ?', $rsm);
            $query->setParameter(1, $limit);
            $query->setParameter(2, $offset);
            $result = $query->getArrayResult();