我只想删除最低ID的行。
我正在尝试:
$query = 'DELETE FROM PATHTOENTITY ORDER BY id ASC LIMIT 1';
$query = $this->entityManager->createQuery($query);
$query->execute();
并获取此错误:
[语法错误]第0行,col 53:错误:弦的预期末端,获得'by'
也许我正在使用错误的方法。任何建议如何在一个数据库调用中使用最低ID删除条目?
正如Kwido所说,您错过了实体别名。但是查询仍然无法执行。
首先,DQL不支持LIMIT
表达式。这是特定于mySQL的功能,不是ANSI SQL。其他平台驱动程序具有自己的这种行为的实现,所有这些行为都由公共接口提供:Query
对象的setFirstResult()/setMaxResult()
。
第二,DQL不支持DELETE
使用ORDER BY
子句(请参阅Lanagenage EBNF)。它也是非标准功能,但不能为其他驱动程序实现,因此学说不允许。
如果您需要执行此查询,则必须使用本机SQL。
在使用DQL时为您的实体定义一个别名。请参阅:学说 - 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();
}
用您的实体classname的首字母替换Entityalias,这是学说最常见的做法。
//编辑 - @timurib所述DQL不知道限制。应该使用setmaxresults。
//edit2-作为delete语句的订单不支持订单,而仅由where子句。现在,我们使用另一个查询在删除之前返回标识符。请参阅DQL-语句
$query = 'DELETE FROM table ORDER BY id ASC LIMIT 1';
$stmt = $this->entityManager->getConnection()->prepare($query);
$stmt->execute();
您无法从EntityManager删除或更新。首先,您必须从存储库中选择/查找实体,然后将其删除。我的建议适用于RAW SQL查询。