繁体   English   中英

选择上一个和下一个记录时,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]:语法错误或访问冲突:1064 SQL语法有错误; 检查与您的MySQL服务器版本相对应的手册以获取在':Article WHERE id =(SELECT id FROM'在第2行附近)附近使用的正确语法

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

谢谢

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

我怀疑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 > ?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM