我所追求的是以下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的记录。一方面,感觉就像一个kludge / hack这样做,而另一方面,在DQL中做直接SQL中的简单查询感觉有点愚蠢,因为DQL没有形成非常优雅。无论如何,我已经花了这么多时间,现在我很好奇在DQL中正确的做法是什么。
答案 0 :(得分:2)
我最终走了native 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);