使用查询构建器删除Doctrine 2

时间:2013-03-21 18:13:08

标签: php doctrine-orm

我有两个实体关系OneToMany,ProjectServices。现在我想通过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查询。

欢迎任何想法和例子。

2 个答案:

答案 0 :(得分:56)

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

所以你的第一个例子将改为:

$qb = $em->createQueryBuilder();
$qb->delete('Services', 's');
$qb->where('s.project = :project');
$qb->setParameter('project', $project);

答案 1 :(得分:5)

如果你真的无法获得项目对象,而且只能使用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。

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

相关问题