2010-10-15 107 views
5

目前這個函數的工作原理:它顯示一個特定的遊戲,有多少個作業。SQL/Doctrine:左連接問題

問題:如果沒有工作,遊戲不會出​​現在列表中。

即使沒有附加作業,如何顯示遊戲?

感謝

public function getWithGames() 
    { 
     $q = $this->createQuery('c') 
      ->leftJoin('c.stJob j') 
      ->where('j.expires_at > ?', date('Y-m-d h:i:s', time())) 
      ->addOrderBy('c.name'); 

     $q->andWhere('j.is_activated = ?', 1); 
     $q->andWhere('j.is_public = ?', 1); 


     return $q->execute(); 
    } 

回答

10

你的條件應該是左的一部分JOIN ... ON子句。所述ON條款(而不是在WHERE)在

$q = $this->createQuery('c') 
    ->leftJoin('c.stJob j WITH j.expires_at > ? AND j.is_activated = 1 AND j.is_public = 1', date('Y-m-d h:i:s', time())) 
    ->addOrderBy('c.name'); 

把條件表明它們特別適用於JOIN。如果沒有行滿足這些條件,那麼就沒有聯接 - 而這正是你想要的。將它們放入WHERE表示結果行必須滿足這些條件。顯然,如果沒有加入,則無法滿足任何有關j表的條件。

+0

我認爲這真的不重要,因爲它的左加入。所以無論條件適用於何處。但看看他定義的問題。如果沒有工作,則不列出。所以他想要一個連接的值(工作屬性公開和激活的是1)或(兩者都是NULL)......(如果沒有工作就會發生這種情況)。最後的部分是他忘了 – 2010-10-15 16:00:18

+3

它非常重要。做'OR ...東西是NULL'根本不可取。 「ON」條款的目的在於這些是用於建立連接***的條件。如果沒有行符合這些條件,則不存在連接 - 並且在LEFT JOIN的情況下沒有問題。試圖用手動編寫的「東西是NULL」模擬一個「ON」子句是醜陋的。我希望這不是在這裏倒下的原因。 – VoteyDisciple 2010-10-15 16:02:21

+0

這是完全正確的。給你一個贊成這個:)我不喜歡的是它不是他的代碼中的問題。他的代碼中的問題是一個純粹的語義問題,無法理解左連接實際上做了什麼。 – 2010-10-15 16:07:27

1
$q->andWhere('j.is_activated = ?', 1); 
$q->andWhere('j.is_public = ?', 1); 

如果沒有工作的is_activated和is_public場不能是1,所以你需要像這將是無效的:where (j.is_activated = 1 and j.is_activated = 1) or (j.is_activated = IS NULL and j.is_activated IS NULL) ...

我不熟悉的東西librar您正在使用構建此查詢,但我想它可能像這樣工作:

public function getWithGames() 
    { 
     $q = $this->createQuery('c') 
      ->leftJoin('c.stJob j') 
      ->where('j.expires_at > ?', date('Y-m-d h:i:s', time())) 
      ->addOrderBy('c.name'); 

     $q->andWhere('(j.is_activated = ? AND j.is_public = 1) OR (j.is_activated IS NULL AND j.is_publicIS NULL)', 1); 

     return $q->execute(); 
    } 

這是不漂亮...但正如我所說的,我不知道您的圖書館。你可能會傳遞一系列參數或者做一些類似「orWhere ....」的事情...... blabla ...

它的做法也很笨拙,可以做得更好。直接使用條件建立連接!這樣你可以避免整個桌子加在一起,然後過濾...