Как мне написать этот SQL в DQL?

Мне нужен следующий SQL-запрос

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

в ДКЛ. Что у меня есть до сих пор

$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, а затем выполнить findOneById(), чтобы получить запись с помощью Doctrine. С одной стороны, это похоже на кладж/хак, а с другой стороны, кажется глупым делать в DQL то, что было бы простым запросом в прямом SQL, поскольку DQL не формируется. быть очень элегантным. Во всяком случае, я потратил на это много времени, и теперь мне любопытно, как правильно это сделать в DQL.


person Jason Swett    schedule 05.07.2012    source источник


Ответы (1)


В итоге я пошел по пути нативный SQL. Я как-то забыл про третий вариант.

$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);
person Jason Swett    schedule 05.07.2012