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

Symfony DQL syntax error while selecting last and next record

我想在我的数据库中获取下一条和上一条记录,这是我第一次使用 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]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ':Article WHERE id = (SELECT id FROM ' at line 2

如果有人能帮助我,我将不胜感激。

谢谢

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

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

的实际名称

如果那是你的 table 名字,那么你可以用反引号将它括起来:

 FROM `SITEArticlesBundle:Article`

我不确定您为什么要将 $id 的值与文字 2 进行比较,而不是将其与 table 中 id 列的值进行比较。没看懂。

除非您尝试将列名作为绑定参数传入,否则这将不起作用。您只能将 values 传递给准备好的 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 > ?