选择上一条和下一条记录时出现 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 > ?
我想在我的数据库中获取下一条和上一条记录,这是我第一次使用 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 > ?