2017-10-13 108 views
1

我有一個問題表及答案(結果)表該symfony的應用程序不同:主義的左連接的行爲與相關聯的每個問題,普通的SQL

問題表:

id | question_title 
------------------- 
1 | Name? 
2 | Age? 

結果表:

id | answer_text | question_id | user_id 
---------------------------------------- 
1 | John  | 1   | 10 
2 | Peter  | 1   | 11 
3 | 24   | 2   | 10 

用戶可能跳過問題,因此它可能不是答案表中給定問題的匹配答案。但是,當我檢索給定用戶的結果時,我想要全面列出每個問題和相關答案,或者爲空,以防萬一它不存在。因此,(在普通的SQL)我離開加入這樣的:

SELECT question_text, answer_text FROM `question` left join result on question.id = result.question_id and user_id=10 

獲取我:

question_text | answer_text 
---------------------------------------- 
Name?   | John 
Age?   | 24 

對於USER_ID 11,這看起來像:

question_text | answer_text 
---------------------------------------- 
Name?   | Peter 
Age?   | null 

正是我所期望的。

當我嘗試將此查詢轉換爲dql查詢時出現問題。我這樣做是這樣的:

$qb->select('q.question_title, r.answer_text'); 
    $qb->from('AppBundle:Question', 'q'); 
    $qb->leftJoin(
     'AppBundle:Result', 
     'r', 
     \Doctrine\ORM\Query\Expr\Join::WITH, 
     'q.id = r.question' 
    ); 
    $qb->where('r.user = '.$user->getId()); 

    $answer= $qb->getQuery()->getResult(); 

對於在連接的右側具有匹配數據的數據集,它工作正常。但是,當右側爲空時,它會從返回的數組中除去,但getResult。這將高於純SQL的第一個例子轉儲:

array:2 [ 
    0 => array:2 [ 
     "question_title" => Name? 
     "answer_text" => "John" 
    ] 
    1 => array:2 [ 
     "question_title" => Age? 
     "answer_text" => "24" 
    ] 
] 

這是第二個例子轉儲。沒有匹配的答案,我得到的只是1個元素的數組:

array:2 [ 
    0 => array:2 [ 
     "question_title" => Name? 
     "answer_text" => "Peter" 
    ] 
] 

我不知道是否有任何的方式來模仿實際的行爲我與左連接在普通的SQL。

順便說一下,數據庫引擎即時通訊使用的是MySQL,以防萬一。

編輯:實際上不是什麼在Doctrine2 LEFT JOIN with 2 conditions被問。以爲我有相同的查詢在DQL和SQL中表現不同。原來,我只是把它翻譯過來。

+1

的可能的複製[Doctrine2 LEFT加入2個條件](https://stackoverflow.com/questions/15815869/doctrine2-left-join-with-2-conditions)這顯然是基本的,你發現了什麼谷歌搜索,說'教條左連接多個' ? – philipxy

+0

那真的不是我所問的。我以爲我在SQL中的查詢在DQL中的表現有所不同,但我實際上是在翻譯它錯誤,正如下面的用戶所指出的那樣。 –

+0

在這個問題中,*問*是什麼(儘管它的(不好))標題)是爲什麼結果以某種方式出現錯誤,給出了一些'join's&a'where'。因此,對問題的合理描述包括您的情況。在這個問題中*回答的是,提問者在他們需要「開」時錯誤地將條件放在「哪裏」。這是你的問題的答案。這也是其他許多點擊,也從變體點擊。我*發現*由我給的谷歌回答。所以... – philipxy

回答

1

如果你看到DQL查詢你想在加入結果集應用WHERE條款,所以你的過濾器正常工作,並篩選出結果,其中用戶ID不是11

現在,如果你看看你的SQL查詢你沒有使用WHERE子句試圖加入結果表與問題ID和用戶是11,所以它會加入結果表中的行,其中用戶ID是11,併爲非匹配行生成空。

有(後進行連接操作),其具有上ON子句和WHERE,上ON子句過濾器將同時WHERE被施加到連接結果集中在接合時只工作的過濾器的差。

要編寫DQL相當於你的SQL可以寫成

SELECT q.question_title, r.answer_text 
FROM AppBundle:Question q 
LEFT JOIN AppBundle:Result r 
    WITH q.id = r.question AND r.user = :user 

其更好地在你的實體定義的映射,而不是執行手動加入Association Mapping

+0

是的,這是顯而易見的,出於某種原因,我一直在想我的原始SQL中有一個位置過濾器。底線:我的錯。謝謝。 –