2016-12-21 44 views
1

我只想删除最低ID的行。删除最低ID的条目

我想这一点:

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

而且收到此错误:

[Syntax Error] line 0, col 53: Error: Expected end of string, got 'BY'

也许我使用错误的做法。 任何建议如何删除一个数据库调用中具有最低ID的条目?

回答

2

正如Kwido所说,您错过了实体别名。但查询仍然无法执行。

首先,DQL不支持LIMIT表达式。这是MySQL特有的功能,不是ANSI SQL。其他平台驱动程序都有自己的这种行为实现,所有这些都由通用接口提供:setFirstResult()/setMaxResult()Query对象。

其次,DQL不支持DELETEORDER BY子句(请参阅语言EBNF)。它也是非标准功能,但不能用于其他驱动程序,所以Doctrine不允许它。

如果您需要执行此查询,您将不得不使用本机SQL。

+0

好的,这听起来正确。因为如果我试图通过本地SQL删除条目,它就可以工作。我不确定使用ORDER BY的DELETE不受DQL支持。谢谢! – Syerad

1
$query = 'DELETE FROM table ORDER BY id ASC LIMIT 1'; 
$stmt = $this->entityManager->getConnection()->prepare($query); 
$stmt->execute(); 

您无法从entityManager中删除或更新。首先,您必须从Repository中选择/查找实体,然后将其删除。我的建议适用于原始SQL查询。

+0

是的,当然原始的sql工作。但我只是想避免原始的SQL。无论如何。 – Syerad

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。

//编辑 - 由于@Timurib声明DQL不知道LIMIT。应该使用setMaxResults

//编辑2 - 由于DELETE语句不支持ORDER BY,但仅支持WHERE子句。我们现在使用另一个查询在删除之前返回标识符。请参阅DQL - Statements

+0

Thx,但该查询无法执行。我得到一个语法错误,可能是因为“ORDER BY” – Syerad

+0

@Sploat像Timurib的回答说,DELETE不支持“ORDER BY”子句,而只支持“WHERE”子句。将更新我的答案。 – Kwido

+0

@Sploat - 使用select查询获取第一个ID,而不是使用ORDER BY,这在DQL Delete语句中不被支持,如Timurib在他的回答中所述。 – Kwido