1

私が求めているのは、次のSQLクエリです

SELECT p.*
  FROM player p
 WHERE CONCAT(p.first_name, ' ', p.last_name) = ?

DQLで。私が今まで持っているのは

$qb->add('select', 'p')
   ->add('from', 'VNNCoreBundle:Player p')
   ->add('where', $qb->expr()->eq(
        $qb->expr()->concat('p.firstName', $qb->expr()->concat(' ', 'p.lastName')),
        ':name'
     ))
   ->setParameters(array('name' => $name));

しかし、それは間違っています。

ネイティブSQLを使用してレコードのIDを取得しfindOneById()てから、Doctrineを使用してレコードを取得することができます。一方で、それを行うのはちょっとした/ハックのように感じますが、他方では、DQLが形を整えていないため、ストレートSQLで単純なクエリを実行するためにDQLで行うのはちょっと馬鹿げているように感じますとてもエレガントに。とにかく、私はそれに多くの時間を費やしました、そして私は今それをする正しい方法がDQLで何であるか興味があります。

4

1 に答える 1

2

結局、ネイティブSQLルートを使用することになりました。私はその3番目のオプションをちょっと忘れました。

$rsm = new ResultSetMapping;
$rsm->addEntityResult('Player', 'p');
$rsm->addFieldResult('p', 'id', 'player_id');
$rsm->addFieldResult('p', 'name', 'name');

$sql = " 
    SELECT p.*
      FROM players p
     WHERE CONCAT(p.first_name, ' ', p.last_name) = ?
";

$query = $this->getEntityManager()->createNativeQuery($sql, $rsm);
$query->setParameter(1, $name);
于 2012-07-05T14:34:19.490 に答える