簡體   English   中英

在 Doctrine Symfony2 中使用查詢生成器實現 SQL 聯合查詢

[英]Implement SQL Union Query using Query Builder in Doctrine Symfony2

我目前正在使用 Symfony2 框架。 我不知道如何通過 Symfony2 中的查詢生成器加入我的 2 個查詢,我只能使用 SQL UNION 查詢加入它們。 下面是返回正確結果的查詢。

SELECT * FROM (SELECT m.id, m.subject, m.date 
FROM message m JOIN message_incoming mi ON m.id = mi.id
WHERE m.recipient_id = 1
AND mi.trash = 1
AND mi.deleted = 0) AS y
UNION 
SELECT * FROM (SELECT m.id, m.subject, m.date 
FROM message m JOIN message_outgoing mo ON m.id = mo.id
WHERE m.originator_id = 1
AND mo.trash = 1
AND mo.sent = 1
AND mo.deleted = 0) AS z
ORDER BY date DESC

我試圖在 1 個查詢(沒有 UNION)中加入這段代碼以獲得正確的結果,但我失敗了。

那么我如何使用查詢構建器實現這個查詢呢?

請指教,謝謝。

在不對 Doctrine2 本身進行太多修改的情況下編寫此類查詢的最佳方法是使用NativeQuery

native/sql QueryBuilder使用與 ORM 完全相同的 API。 並且您能夠將結果映射到現有實體。

我不知道在不檢查條件的情況下加入 2 個查詢時我有多愚蠢。 這是正確的查詢:

SELECT m.id, m.subject, m.date
FROM message m 
JOIN message_incoming mi ON m.id = mi.id
JOIN message_outgoing mo ON m.id = mo.id
WHERE m.recipient_id = 1
AND mi .trash = 1
AND mi .deleted = 0
OR m.originator_id = 1
AND mo .trash = 1
AND mo .deleted =0
AND mo .sent = 1
ORDER by date DESC

我嘗試通過查詢生成器實現它:

$queryBuilder = $this->entityManager->getRepository('EzxWebmailBundle:Message')
            ->createQueryBuilder('m')
            ->select('m.id','m.subject','m.date')
            ->join('m.message_outgoing','mo','ON','m.id = mo.id')
            ->join('m.message_incoming','mi','ON','m.id = mi.id')
            ->where('m.recipient_id = '.$userId)
            ->andWhere('mi.trash = 1')
            ->andWhere('mi.deleted = 0')
            ->orWhere('m.originator_id = '.$userId)
            ->andWhere('mo.trash = 1')
            ->andWhere('mo.deleted = 0')
            ->andWhere('mo.sent = 1')
            ->orderBy('m.date','DESC');
$result = $queryBuilder->getQuery()->getResult();

它返回不正確的結果是多么令人驚訝:所以我試圖查看使用生成的查詢:

var_dump($queryBuilder->getQuery());

我真的不知道為什么 doctrine 在我得到這個結果時會產生額外的括號(仔細看看 WHERE 子句):

SELECT m.id, m.subject, m.date FROM message m 
INNER JOIN message_outgoing mo ON m.id = mo.id
INNER JOIN message_incoming mi ON m.id = mi.id
WHERE ((m.recipient_id = 1 AND mi.trash = 1 AND mi.deleted = 0) OR m.originator_id = 1) AND mo.trash = 1 AND mo.deleted = 0 AND mo.sent = 1 
ORDER BY m.date DESC

所以如果我添加自己的括號,這一定是正確的:

$queryBuilder = $this->entityManager->getRepository('EzxWebmailBundle:Message')
            ->createQueryBuilder('m')
            ->select('m.id','m.subject','m.date')
            ->join('m.message_outgoing','mo','ON','m.id = mo.id')
            ->join('m.message_incoming','mi','ON','m.id = mi.id')
            ->where('(m.recipient_id = '.$userId)
            ->andWhere('mi.trash = 1')
            ->andWhere('mi.deleted = 0)')
            ->orWhere('(m.originator_id = '.$userId)
            ->andWhere('mo.trash = 1')
            ->andWhere('mo.deleted = 0')
            ->andWhere('mo.sent = 1)')
            ->orderBy('m.date','DESC')

覺得有點傻。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM