【问题标题】:Doctrine2: How to create nested JOIN statementsDoctrine2:如何创建嵌套的 JOIN 语句
【发布时间】:2016-06-15 21:39:02
【问题描述】:

我正在使用 Doctrine 构建以下查询:

SELECT 
    c0_.id AS id0,
    c0_.name AS name1,
    SUM(a1_.credit) AS sclr2,
    SUM(a1_.debit) AS sclr3
FROM
    complexes c0_
        LEFT JOIN
    acc_records a1_ 
        INNER JOIN
            acc_codes a2_ 
            ON (a2_.id = a1_.acccode_id AND a2_.l1 = 3 AND a2_.l2 = 10)
    ON c0_.id = a1_.complex_id
GROUP BY c0_.id

如您所见,我将 ON 语句并排放置以进行嵌套连接查询。

以下代码将 ON 语句放在相应的 JOIN 语句旁边。

$er->createQueryBuilder('c')->select('c.id, c.name,sum(ad.credit) as cr, sum(ad.debit) as dr')
->leftJoin('c.accrecords','ad')
->innerJoin('AccCode', 'ac', 'WITH','ac.id = ad.acccode and ac.l1=3 and ac.l2=10')
->groupBy('c.id')
->getQuery()->getSQL();

结果是这样的:

SELECT 
    c0_.id AS id0,
    c0_.name AS name1,
    SUM(a1_.credit) AS sclr2,
    SUM(a1_.debit) AS sclr3
FROM
    complexes c0_
        LEFT JOIN
    acc_records a1_ ON c0_.id = a1_.complex_id
        INNER JOIN
    acc_codes a2_ ON (a2_.id = a1_.acccode_id AND a2_.l1 = 3
        AND a2_.l2 = 10)
GROUP BY c0_.id

这对我不起作用。有人有解决办法吗?

【问题讨论】:

  • 只是指出我个人在 dql 和查询构建器方面的经验,当涉及到连接时 ===> 使用本机查询。
  • 原生查询是指DQL吗?重点是编写 DQL 也无济于事!使用 DQL,ON 不起作用,您必须使用 WITH,我尝试创建嵌套 JOIN 语句,但最终出现异常
  • 本地查询我的意思是doctrine-orm.readthedocs.io/projects/doctrine-orm/en/latest/…。我举了一个例子作为答案,只是因为我不能把它放在这里作为评论。请仅以它为例,我将来会删除它,以免被否决。 (尤其是对于 ON 而不是 WITH)

标签: php sql symfony doctrine-orm dql


【解决方案1】:
 $em= $this->entityManager;

            $rsm = new ResultSetMapping();

            $rsm->addEntityResult('MembersManagementBundle:Message', 'm');
            $rsm->addFieldResult('m', 'id', 'id');
            $rsm->addFieldResult('m', 'message_date', 'messageDate');
            $rsm->addMetaResult('m', 'sender_id', 'sender_id');
            $rsm->addMetaResult('m', 'receiver_id', 'receiver_id'); 
            $rsm->addMetaResult('m', 'post_id', 'post_id');
            $rsm->addScalarResult('result', 'result');

            $query = $em->createNativeQuery('SELECT m.*, s.rs as result
                FROM  message AS m
                INNER JOIN (SELECT id, sender_id, MAX(message_date) as md FROM message WHERE message_seen=0 and  receiver_id =? GROUP BY post_id,sender_id) AS t
                INNER JOIN (SELECT id, sender_id, COUNT(message_seen) as rs FROM message WHERE message_seen=0 and receiver_id=? GROUP BY  post_id, sender_id) AS s
                ON m.message_date=t.md and t.id=s.id
                WHERE receiver_id =?
                GROUP BY post_id, sender_id
                ORDER BY message_date DESC', $rsm);
            $query->setParameter(1, $receiver_id)
            ->setParameter(2, $receiver_id)
            ->setParameter(3, $receiver_id);

            $n= $query->getResult();

【讨论】:

  • 感谢您分享您的经验 :-) 它对我有用
猜你喜欢
  • 2012-10-09
  • 2019-05-15
  • 2018-05-25
  • 1970-01-01
  • 2021-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
相关资源
最近更新 更多