选择上一条和下一条记录时出现Symfony DQL语法错误

时间:2016-09-13 23:11:22

标签: php mysql symfony doctrine-orm dql

我想在我的数据库中获取下一个和上一个记录,这是我第一次使用DQL而且我真的不明白它为什么不起作用。

这是我的自定义查询的样子:

    $em = $this->getDoctrine()->getManager();
    $rsm = new ResultSetMapping();
    $rsm->addScalarResult('id', 'id');

    $query = $em->createNativeQuery(
        'SELECT id 
        FROM SITEArticlesBundle:Article
        WHERE
            id = (SELECT id
            FROM SITEArticlesBundle:Article
            WHERE ? > 2 LIMIT 1)
        OR
            id = (SELECT id 
            FROM SITEArticlesBundle:Article
            WHERE ? < 2 LIMIT 1)', $rsm);
    $query->setParameter(1, $id);
    $query->setParameter(2, $id);
    $nextAndPrevNews = $query->execute();

我想得到2个id的数组,就像那样:

[
    ['id' => 1]
    ['id' => 3]
]

但是我收到了SQL语法错误

  

SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中有错误;查看与您的MySQL服务器版本对应的手册,以获得在&#39;:文章附近使用的正确语法   哪里   id =(SELECT id   来自&#39;在第2行

如果有人能帮助我,我将非常感激。

由于

1 个答案:

答案 0 :(得分:1)

一个问题是表名中的冒号字符。除非转义表名,否则不允许使用该字符。

我怀疑SITEArticlesBundle:Article不是MySQL表的实际标识符。在本机查询中,您需要指定MySQL表的实际名称。

如果这是你的表名,那么你可以用反引号字符将其括起来:

 FROM `SITEArticlesBundle:Article`

我不确定为什么要将$ id的值与文字2进行比较,而不是将其与表格中id列的值进行比较。我不明白。

除非您尝试将列名称作为绑定参数传递,否则将无效。您只能将传递给准备好的SQL语句,不能将标识符或关键字或其他SQL结构作为绑定参数传递。

就个人而言,我会避免OR条件和子查询,只使用UNION ALL操作。

 SELECT MAX(p.id) AS id
   FROM `SITEArticlesBundle:Article` p
  WHERE p.id < ?
  UNION ALL 
 SELECT MIN(n.id) AS id
   FROM `SITEArticlesBundle:Article` n
  WHERE n.id > ?