2010-10-15 9 views
5

वर्तमान में यह फ़ंक्शन काम करता है: यह एक विशिष्ट गेम के लिए प्रदर्शित करता है, कितनी नौकरियां हैं।एसक्यूएल/सिद्धांत: बाएं समस्या से जुड़ें

समस्या: यदि कोई नौकरी नहीं है, तो गेम सूची में प्रकट नहीं होता है।

कोई नौकरी संलग्न होने पर भी गेम को कैसे प्रदर्शित किया जाए?

धन्यवाद

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

आपका स्थिति वाम का हिस्सा होना चाहिए शामिल हों ... खंड पर। 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 में डालकर इंगित करता है कि परिणाम पंक्तियों को उन शर्तों को पूरा करना होगा। और जाहिर है कि अगर कोई शामिल नहीं हुआ है, तो आप तालिका के बारे में किसी भी शर्तों को संतुष्ट नहीं कर सकते हैं।

+0

मुझे लगता है कि यह वास्तव में कोई बाएं नहीं है क्योंकि यह बाएं शामिल है। इसलिए कोई फर्क नहीं पड़ता कि स्थिति कहाँ लागू होती है। लेकिन देखो कि वह समस्या के रूप में क्या परिभाषित करता है। यदि कोई नौकरी नहीं है, तो यह सूचीबद्ध नहीं है। इसलिए वह एक जुड़ा हुआ वैल्यू चाहता है जहां (नौकरी की विशेषता सार्वजनिक और सक्रिय होती है 1) या (दोनों न्यूल हैं) ... (यदि कोई नौकरी नहीं होती है तो ऐसा होता है)। आखिरी हिस्सा वह है जो वह –

+3

भूल गया है यह बहुत मायने रखता है। एक 'या ... सामान है नल' सभी वांछनीय नहीं है। 'ऑन' क्लॉज का बहुत ही उद्देश्य यह है कि ये शर्तें *** शामिल हैं जो *** शामिल करने के लिए उपयोग की जाती हैं। यदि उन पंक्तियों से कोई पंक्तियां मेल नहीं खाती हैं, तो कोई जुड़ाव नहीं है - और बाएं जॉइन के मामले में ठीक है। मैन्युअल रूप से लिखे गए "सामान 'नल के साथ' ऑन 'क्लॉज की नकल करने की कोशिश कर रहे हैं" सामान शून्य है "स्थितियां बदसूरत हैं। मुझे उम्मीद है कि यहां एक डाउनवोट का कारण नहीं है। – VoteyDisciple

+0

जो पूरी तरह से सच है। इस के लिए आपको एक उपरांत दिया :) मुझे जो पसंद नहीं आया वह यह था कि यह उसके कोड में समस्या नहीं है। उनके कोड में समस्या यह समझने की पूरी तरह से अर्थपूर्ण समस्या थी कि वास्तव में क्या बाएं शामिल होता है। –

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(); 
    } 

इस सुंदर नहीं है ... लेकिन जैसा कि मैंने कहा मुझे नहीं अपने पुस्तकालय में पता है। आप शायद तर्कों की एक सरणी पारित कर सकते हैं या "या कहीं ...." blabla ...

जिस तरह से किया जाता है वह भी बेकार है और इसे बेहतर किया जा सकता है। शामिल होने के लिए सीधे स्थितियों का उपयोग करें! इस तरह आप पूरी सारणी को जोड़कर और बाद में फ़िल्टर किए जाने से बचते हैं ...

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^