我有两个实体与关系OneToMany,Project
和Services
。现在我想删除project_id提供的所有服务。
第一次尝试:
$qb = $em->createQueryBuilder();
$qb->delete('Services','s');
$qb->andWhere($qb->expr()->eq('s.project_id', ':id'));
$qb->setParameter(':id',$project->getId());
此尝试失败,并出现异常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查询。
任何想法和例子都将受到欢迎。
发布于 2013-03-22 02:36:58
您使用的是DQL,而不是SQL,所以不要在条件中引用in,而应该引用对象。
因此,您的第一个示例将更改为:
$qb = $em->createQueryBuilder();
$qb->delete('Services', 's');
$qb->where('s.project = :project');
$qb->setParameter('project', $project);
发布于 2014-06-19 17:55:53
如果你真的不能获得项目对象,并且你只需要处理id,你可以使用这个。
引用自Doctrine文档: doctrine有两种批量删除的可能性。您可以发出单个DQL DELETE查询,也可以遍历结果,一次删除一个结果。(下面我只粘贴第一个解决方案)
DQL查询到目前为止,批量删除最有效的方法是使用DQL DELETE查询。
在我的项目中工作的示例
$q = $em->createQuery('delete from AcmeMyTestBundle:TemplateBlock tb where tb.template = '.intval($templateId));
$numDeleted = $q->execute();
在实体模板中,我有一个名为TemplateBlock的属性,它被映射到db中的template_id。
但我同意使用对象是非常可取的方法。
https://stackoverflow.com/questions/15555042
复制相似问题