2012-11-28 17 views
5

सबसे पहले मैं कुछ छद्म कोड के साथ एक उदाहरण दूंगा और फिर मैं समझाऊंगा कि समस्या क्या है। मुझे कहना है कि मेरे पास दो इकाइयां उपयोगकर्ता और फोनेनंबर हैं। उनका रिश्ता एक से कई है। अगर मैं की तरह कुछ हैसिद्धांत लाने में

class UserRepository 
{ 
    public function getUser($id, $type) 
    { 
     $users = $this->createQuery("SELECT u, p FROM User u JOIN u.phonenumbers p 
      WHERE u.id = :id AND p.type = :type") 
      ->setParameters(array(
       'id' => $id, 
       'type' => $type, 
      )) 
      ->getResult(); 
     return $users[0]; 
    } 
} 

मेरे ऐप में:

$user = $userRepo->getUser(1, 'home'); 
var_dump($user->getPhonenumbers()); // here phonenumbers collection is ok 

$user = $userRepo->getUser(1, 'work'); 
var_dump($user->getPhonenumbers()); // Here phonenumbers collection is wrong. 
           // It's exactly the same as the previous one. 

तो मेरे सवालों का है: मेरे UserRepository में मैं ऐसा ही कुछ हो सकता है यह संभव लाने का उपयोग करने में शामिल होने के (विभिन्न मानदंडों के साथ) है और हर बार उचित संग्रह प्राप्त करने के लिए?

उत्तर

3

संग्रह में शामिल होने और फ़िल्टर करने में ऐसी चीज़ें नहीं हैं जो अच्छी तरह से मिलकर काम करती हैं। यहाँ आप इसे कैसे करना चाहिए:

SELECT 
    u, p 
FROM 
    User u 
JOIN 
    u.phonenumbers p 
JOIN 
    u.phonenumbers p2 
WHERE 
    u.id = :id 
    AND 
    p2.type = :type 

यह दूसरी में शामिल हो गए हैं (और हाइड्रेटेड नहीं) p2, जो सही जलयोजन और छानने में जो परिणाम पर छानने लागू होता है।

+0

इस पल के लिए मैं क्वेरी :: HINT_REFRESH का उपयोग कर समाप्त करता हूं, जिसका मेरा मानना ​​है कि कुछ प्रदर्शन प्रभाव होगा, लेकिन निश्चित रूप से मैं आपका समाधान जांचूंगा। आपके समय के लिए धन्यवाद। – ventsislaf

-2

क्वेरीबिल्डर का उपयोग करें, यह बहुत आसान है।

public function getUser($id, $type) 
{ 
    return $this->createQueryBuilder("u") 
     ->leftJoin("u.Phonenumbers", "p", "WITH", "p.type=:type") 
     ->where("u.id=:id") 
     ->setParameters(.....) 
     ->getQuery() 
     ->getOneOrNullResult() ; 
} 
+0

उदाहरण सिर्फ एक छद्म कोड है। समस्या सिद्धांत के व्यवहार में है, प्रदान किए गए कोड में नहीं। – ventsislaf

+0

फिर भी वही, बाएं जोइन और स्टेटमेंट का उपयोग करें इससे कोई फर्क नहीं पड़ता कि आप क्वेरी कैसे बनाते हैं। – Zeljko

+0

उदाहरण गलत है। – Ocramius

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