【问题标题】:Doctrine 2 delete with query builderDoctrine 2 使用查询生成器删除
【发布时间】:2013-03-11 09:45:22
【问题描述】:

我有两个具有 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 查询。

欢迎任何想法和示例。

【问题讨论】:

    标签: php doctrine-orm


    【解决方案1】:

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

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

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

    【讨论】:

    • 第三行可以改写如下:$qb->where('s.project = :project');
    • 要执行查询,添加:->getQuery()->execute();
    【解决方案2】:

    如果您真的无法获取项目对象并且您只能使用 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。

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

    【讨论】:

    • 不要在家里这样做,请注意SQL注入!
    • 请注意,DQL 查询不会触发 Doctrine Lifecycle 事件
    • 推荐的方式是$service = $entityManager()->getReference(Services::class, 1); 这是一个虚拟对象,仅用于 DQL 查询中的引用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 2017-01-13
    • 1970-01-01
    • 2014-05-08
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多