删除ID最低的条目

时间:2016-12-21 13:14:31

标签: mysql doctrine-orm symfony

我只想删除ID最低的行。

我正在尝试这个:

$query = 'DELETE FROM PATH\TO\ENTITY ORDER BY id ASC LIMIT 1';
$query = $this->entityManager->createQuery($query);
$query->execute();         

收到此错误:

  

[语法错误]第0行,第53栏:错误:字符串的预期结束,得到'BY'

也许我正在使用错误的方法。 有关如何在一次数据库调用中删除id最低的条目的任何建议吗?

3 个答案:

答案 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