2013-02-19 30 views
7

मैंने डॉक्टर 2.1 में कार्यक्षमता की गंभीर कमी के बारे में बहुत सारे उत्तरों को देखा है जो ओओपी शुद्धता का परिणाम हो सकता है रिलायंस सैनिटी ट्रम्पिंग।सिद्धांत 2.1 जहां विदेशी कुंजी आईडी = ?, संपादित करें: सिद्धांत में फिक्स्ड 2.2

मेरे पास दो से अधिक रिश्तों, लेख और सदस्यों के साथ दो टेबल हैं। एक सदस्य के कई प्रकाशित लेख हो सकते हैं। मालिक पक्ष पर एनोटेशन

/** 
* @var \Member 
* @ORM\ManyToOne(targetEntity="Member") 
* @ORM\JoinColumns({ 
* @ORM\JoinColumn(name="member_id", referencedColumnName="id") 
* }) 
*/ 
private $member; 

मैं सदस्य 6 के लिए सभी सक्रिय लेख प्राप्त करना चाहते हैं, यह एसक्यूएल में एक साधारण क्वेरी है:

SELECT * FROM mbr_article 
    WHERE active = 1 AND member_id = 6 
    ORDER BY article_id DESC 

क्या मैं

था
$rep = $this->getDoctrine()->getRepository('SMWMemberBundle:Article'); 
$q = $rep->createQueryBuilder('a') 
    ->leftJoin('a.member','m')  
    ->where('m.id = ?1') 
    ->andWhere('a.active = 1') 
    ->orderBy('a.id', 'DESC') 
    ->setParameter(1, $id)  
    ->getQuery(); 
साथ समाप्त हो गया

जो उत्पन्न

SELECT m0_.id AS id0, m0_.active AS active1, m0_.update_time AS update_time2, 
     m0_.content AS content3, m0_.member_id AS member_id4 
    FROM mbr_article m0_ 
    LEFT JOIN mbr_member m1_ ON m0_.member_id = m1_.id 
    WHERE m1_.id = ? AND m0_.active = 1 
    ORDER BY m0_.id DESC 

जो काम करता है और शायद इतना धीमा नहीं है, लेकिन उस जॉइन की आवश्यकता नहीं है क्योंकि मेरे पास पहले से ही सदस्य वस्तु है। जब मैंने इसे दूसरी तरह से कोशिश की, तो मुझे सभी लेख केवल सक्रिय नहीं मिला।

मैंने Can you get a foreign key from an object in Doctine2 without loading that object? जैसे प्रतिक्रियाएं देखी हैं जो getEntityIdentifier का उपयोग करती हैं और 2.2 में आने वाले सुधारों का उल्लेख करती हैं जहां मैं IDENTITY(member) कह सकता हूं।

क्या सिद्धांत 2.1 में ऐसा करने का कोई उचित तरीका है? क्या क्वेरी बिल्डर में andWhere('IDENTITY(member) = ?') की वृद्धि होगी?

संपादित करें:

@Ocramius के लिए धन्यवाद, -> जहां ('? पहचान (a.member) = 1') सिद्धांत में काम 2.2

+0

पहले, विचार है कि 2.1 समर्थन अब और नहीं है: क्या आप उन्नयन पर विचार करना चाहिए। वैसे भी, प्रॉक्सी से पहचानकर्ता को पुनर्प्राप्त करने से यह विधि लोड नहीं हो पाती है यदि विधि का नाम 'मिलता है'। ucfirst ($ fieldName) ' – Ocramius

+0

@ ओक्रैमियस धन्यवाद, '-> कहां (' पहचान (ए.मेम्बर) =? 1 ')' सिद्धांत 2.2 में काम करता है, क्या आप इसे उत्तर के रूप में पोस्ट कर सकते हैं और मैं इसे स्वीकार करूंगा । –

+0

इसे स्वयं जोड़ें और इसे स्वीकार करें, आपको स्वयं समाधान मिला है;) – Ocramius

उत्तर

20

पहचान कहां खंड में क्वेरी बिल्डर द्वारा उत्पन्न करता है में काम करता है सिद्धांत 2.2 उदाहरण के लिए।

$q = $rep->createQueryBuilder('a') 
    ->where('IDENTITY(a.member) = ?1') 
    ->andWhere('a.active = 1') 
    ->orderBy('a.id', 'DESC') 
    ->setParameter(1, $id)  
    ->getQuery(); 

निम्नलिखित एसक्यूएल का उत्पादन:

सभी की
SELECT m0_.id AS id0, m0_.active AS active1, m0_.update_time AS update_time2, 
     m0_.content AS content3, m0_.member_id AS member_id4 
    FROM mbr_article m0_ 
    WHERE m0_.member_id = ? AND m0_.active = 1 
    ORDER BY m0_.id DESC