首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >原则2使用查询构建器删除

原则2使用查询构建器删除
EN

Stack Overflow用户
提问于 2013-03-22 02:13:08
回答 2查看 74.3K关注 0票数 32

我有两个实体与关系OneToMany,ProjectServices。现在我想删除project_id提供的所有服务。

第一次尝试:

代码语言:javascript
复制
$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。这是真的,该属性并不存在,它只存在于数据库表中作为外键。

第二次尝试:

代码语言:javascript
复制
$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查询。

任何想法和例子都将受到欢迎。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-22 02:36:58

您使用的是DQL,而不是SQL,所以不要在条件中引用in,而应该引用对象。

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

代码语言:javascript
复制
$qb = $em->createQueryBuilder();
$qb->delete('Services', 's');
$qb->where('s.project = :project');
$qb->setParameter('project', $project);
票数 69
EN

Stack Overflow用户

发布于 2014-06-19 17:55:53

如果你真的不能获得项目对象,并且你只需要处理id,你可以使用这个。

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

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

在我的项目中工作的示例

代码语言:javascript
复制
$q = $em->createQuery('delete from AcmeMyTestBundle:TemplateBlock tb where tb.template = '.intval($templateId));
$numDeleted = $q->execute();

在实体模板中,我有一个名为TemplateBlock的属性,它被映射到db中的template_id。

但我同意使用对象是非常可取的方法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15555042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档