我只想删除ID最低的行。
我正在尝试这个:
$query = 'DELETE FROM PATH\TO\ENTITY ORDER BY id ASC LIMIT 1';
$query = $this->entityManager->createQuery($query);
$query->execute();
收到此错误:
[语法错误]第0行,第53栏:错误:字符串的预期结束,得到'BY'
也许我正在使用错误的方法。 有关如何在一次数据库调用中删除id最低的条目的任何建议吗?
答案 0 :(得分:2)
正如Kwido所说,你错过了实体别名。但查询仍然无法执行。
首先,DQL不支持LIMIT
表达式。它是MySQL特有的功能,不是ANSI SQL。其他平台驱动程序有自己的此行为实现,所有这些都由Query
对象的公共接口setFirstResult()/setMaxResult()
提供。
其次,DQL不支持带有DELETE
子句的ORDER BY
(请参阅语言EBNF)。它也是非标准功能,但不能为其他驱动程序实现,因此Doctrine不允许它。
如果需要执行此查询,则必须使用本机SQL。
答案 1 :(得分:1)
$query = 'DELETE FROM table ORDER BY id ASC LIMIT 1';
$stmt = $this->entityManager->getConnection()->prepare($query);
$stmt->execute();
您无法从entityManager删除或更新。首先,您必须从Repository中选择/查找实体,然后将其删除。我的建议适用于原始SQL查询。
答案 2 :(得分:1)
在使用DQL时为您的实体定义别名。请参阅:Doctrine - By DQL
$query = $this->entityManager->createQuery('SELECT e FROM MyEntity e ORDER BY e.id ASC');
$query->setMaxResults(1); // LIMITS 1
$entities = $query->getResult();
if (count($entities) > 0) {
$query = $this->entityManager->createQuery('DELETE FROM MyEntity e WHERE e.id = :identifier');
$query->setParameter("identifier", $entities[0]->getId());
$query->execute();
}
将entityAlias替换为实体类名的第一个字母,这是Doctrine最常见的做法。
//编辑 - 正如@Timurib所说,DQL不知道LIMIT。应该使用setMaxResults。
// Edit2 - DELETE语句不支持ORDER BY,但只支持WHERE子句。我们现在使用另一个查询在删除之前返回标识符。见DQL - Statements