【问题标题】:How would I write this SQL in DQL?我将如何在 DQL 中编写此 SQL?
【发布时间】:2012-07-05 14:11:46
【问题描述】:

我所追求的是以下 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 中正确的做法是什么。

【问题讨论】:

    标签: sql doctrine-orm dql


    【解决方案1】:

    我最终选择了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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 2013-01-17
      相关资源
      最近更新 更多