32

我有两个与 OneToManyProjectServices. 现在我想通过 project_id 删除所有服务。

第一次尝试:

$qb = $em->createQueryBuilder();
$qb->delete('Services','s');
$qb->andWhere($qb->expr()->eq('s.project_id', ':id'));
$qb->setParameter(':id',$project->getId());

此尝试失败并出现 Exception Entity Service does not have property project_id。确实,该属性不存在,它只是在数据库表中作为外键。

第二次尝试:

$qb = $em->createQueryBuilder();
$qb->delete('Services','s')->innerJoin('s.project','p');
$qb->andWhere($qb->expr()->eq('p.id', ':id'));
$qb->setParameter(':id',$project->getId());

这也产生了一个无效的 DQL 查询。

欢迎任何想法和例子。

4

2 回答 2

71

您正在使用 DQL,而不是 SQL,因此不要在您的条件中引用 ID,而是引用对象。

因此,您的第一个示例将更改为:

$qb = $em->createQueryBuilder();
$qb->delete('Services', 's');
$qb->where('s.project = :project');
$qb->setParameter('project', $project);
于 2013-03-21T18:36:57.587 回答
3

如果您真的无法获得项目对象并且您只能使用 id 处理,您可以使用它。

来自学说文档的引用:使用 Doctrine 进行批量删除有两种可能性。您可以发出单个 DQL DELETE 查询,也可以遍历结果,一次删除一个。(下面我只粘贴第一个解决方案)

DQL 查询 迄今为止,批量删除最有效的方法是使用 DQL DELETE 查询。

在我的项目中工作的示例

$q = $em->createQuery('delete from AcmeMyTestBundle:TemplateBlock tb where tb.template = '.intval($templateId));
$numDeleted = $q->execute();

在实体 TemplateBlock 中,我有一个名为 template 的属性,该属性映射到 db 中的 template_id。

但我同意高度首选的方法是使用对象。

于 2014-06-19T09:55:53.197 回答