[英]Doctrine 2 delete with query builder
我有两个实体关系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查询。
任何想法和例子都将受到欢迎。
您正在使用DQL而不是SQL,因此不要在您的条件中引用ID,而是引用该对象。
所以你的第一个例子将改为:
$qb = $em->createQueryBuilder();
$qb->delete('Services', 's');
$qb->where('s.project = :project');
$qb->setParameter('project', $project);
如果你真的无法获得项目对象而且你必须只处理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。
但我同意这样做的首选方法是使用对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.