【问题标题】:How to do a LEFT JOIN ON OR in Doctrine如何在 Doctrine 中进行 LEFT JOIN ON OR
【发布时间】:2016-04-13 08:23:51
【问题描述】:

我在 Symfony2 中使用 Doctrine 的查询构建器来创建查询以获取实体。

我试图在 MySQL 中得到这个结果:

SELECT u0_.id AS id0
FROM user u0_ 
LEFT JOIN rva_victims r3_ ON u0_.id = r3_.user_id 
INNER JOIN rva r1_ ON r1_.id = r3_.rva_id or u0_.id = r1_.declarant_id

我在 $qb->join() 中尝试了 ON 和 WITH conditionType,但没有任何效果。

有什么想法可以解决我的问题吗?

【问题讨论】:

    标签: php mysql symfony doctrine-orm query-builder


    【解决方案1】:

    解决方案应该非常简单。在您的情况下,假设您在存储库类中,它应该如下所示:

    $this
      ->createQueryBuilder('u')
      ->leftJoin(Victims::class, 'v', Query\Expr\Join::WITH, 'v.user = u.id')
      ->join(Rva::class, 'r', Query\Expr\Join::WITH, 'r.id = v.rva OR u.id = r.declarant');
    

    这应该可以正常工作,我现在只是假设类名。另请注意,所有条件均针对类属性名称 (DQL),而不是列名。

    【讨论】:

    • 我的问题是,Victims 和 Rva 在同一个实体中。事实上,我有我的 Rva 实体,它包含一个受害者属性 Rva@ManyToMany("User") 和一个声明属性 Rva@ManyToOne("User")。我需要在同一个请求中获得所有受害者和声明人。我的加入问题是 WITH,因为我得到了结果:INNER JOIN rva r4_ ON u0_.id = r4_.declarant_id AND (r4_.declarant_id IN (?) OR u0_.id = r4_.declarant_id)
    • 您能否用所涉及的模型定义更新问题?问题出在哪里会更清楚。
    【解决方案2】:

    您可以通过在实体存储库中创建查询构建器来做到这一点

    $qb = $this->createQueryBuilder('u')
         ->leftJoin('yourbundle:Entityname', 'ye', 'WITH', 'u0_.id = r3_.user_id')
         ->innerJoin('yourbuncle:entityname', 'yen', 'WITH', 'r1_.id = r3_.rva_id', 'OR', 'u0_.id = r1_.declarant_id');
    

    【讨论】:

    • 我收到了[Semantical Error] line 0, col 155 near 'OR WITH rvaD.declarant': Error: 'OR' does not point to a Class.
    • 你有没有试过像这样输入'r1_.id = r3_.rva_id OR u0_.id = r1_.declarant_id'...你也得到了你想要的行与mysql上的那个sql查询客户
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    相关资源
    最近更新 更多