2012-06-21 47 views
2

我目前使用的是Symfony2框架。我不知道如何通過Symfony2中的查詢生成器加入我的查詢,我只需使用SQL UNION查詢就可以加入它們。以下是返回正確結果的查詢。在Doctrine中使用查詢生成器實現SQL聯合查詢Symfony2

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)這個代碼,以獲得正確的結果,但我失敗了。

那麼如何使用查詢生成器來實現此查詢?

請指教,謝謝。

+0

你的錯誤是什麼? –

+0

@BorisGuéry上面的查詢在phpmyadmin上運行,沒有錯誤。但問題是我需要使用查詢生成器來實現它。 – khiemnn

+0

你嘗試了什麼?錯誤是什麼讓你認爲它失敗了?或者,您可能正在尋找可以爲您編寫查詢的人嗎? –

回答

0

我不知道我在加入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()); 

我真的不知道爲什麼學說產生額外的括號,因爲我得到這個結果(仔細看看在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 

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

$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') 

覺得有些愚蠢。

+5

老兄,在查詢生成器中使用變量時應該使用參數。不要只將字符串與變量連接起來 – Gigala

1

編寫這樣的查詢的最佳方式是不用對Doctrine2本身進行太多破解就可以使用NativeQuery

本機/ sql QueryBuilder使用與ORM完全相同的API。您可以將結果映射到現有實體。