2012-09-28 11 views
5

मैं एक सिद्धांत डेटाबेस से ऑब्जेक्ट्स को पुनर्प्राप्त करने के लिए एक क्वेरी बनाने की कोशिश कर रहा हूं, जो एक विशिष्ट से-कई रिश्तों के सदस्यों की संख्या से क्रमबद्ध है।किसी व्यवहार के सदस्यों या सदस्यों द्वारा एक सिद्धांत DQL क्वेरी को सॉर्ट करने के लिए कैसे करें?

अधिक विशेष रूप से: मेरे पास दो संस्थाएं हैं: व्यक्ति और संघ। एक व्यक्ति एक संघ का सदस्य हो सकता है (व्यक्ति का 'संघ' संबंध है), और एक संघ में एन लोग (संघ 'लोगों के रिश्ते के रूप में) हो सकते हैं।

मैं एक डीक्यूएल क्वेरी बनाना चाहता हूं जो फेडरेशन की सूची वापस कर देगा, आदेश दिया गया है कि उस संघ के कितने लोग सदस्य हैं। इन पंक्तियों के साथ कुछ:

SELECT f FROM AcmeStatsBundle:Federation f ORDER BY [number of members of f.people] 

यह पहला कदम होगा। एक अतिरिक्त दूसरा चरण है, जिसे मैं नहीं जानता कि एक प्रश्न के साथ हासिल करना संभव है, जो गिनती से पहले संबंध के सदस्यों को फ़िल्टर करेगा। इसलिए जैसा: दूसरा एक इष्टतम परिणाम होगा

SELECT f FROM AcmeStatsBundle:Federation f ORDER BY [number of (f.people p where p.attr = value)] 

यही कारण है, लेकिन पहले एक मेरी जरूरतों को संतुष्ट करता है, अगर दूसरा मामला किसी एक क्वेरी में feasibly नहीं है।

अग्रिम धन्यवाद। AVG, COUNT, MIN, MAX और SUM:

उत्तर

4

DQL में 5 कुल कार्यों आप उपयोग कर सकते हैं (सिद्धांत 2.2) कर रहे हैं।

निम्न क्वेरी काम करना चाहिए:

SELECT f 
FROM AcmeStatsBundle:Federation f 
LEFT JOIN f.people p 
GROUP BY f.id 
ORDER BY COUNT(p) 
WHERE p.attr = :some_value 

अधिक DQL प्रवंचना मैं सुझाव है कि आप official Doctrine docs को देखने के लिए।

+2

जवाब के लिए धन्यवाद! मुझे क्वेरी में मामूली संशोधन करना पड़ा, क्योंकि मुझे लगता है कि आप बिना किसी चयन के कुल मिलाकर ऑर्डर कर सकते हैं। तो अंतिम पूछताछ यह है: 'चुनें एफ, COUNT (पी) AcmeStatsBundle से qtd के रूप में चुनें: फेडरेशन एफ बाएं जॉइन f.people पी WHERE p.attr =: q_' द्वारा डी_आईडी ऑर्डर द्वारा डी –

6

आप की तर्ज पर कुछ कर सकते हैं:

public function getFederationsOrderedByNumberOfPeople() 
{ 
    return $this->createQueryBuilder('f') 
     ->addSelect('COUNT(p) AS HIDDEN personCount'); 
     ->leftJoin('f.people', 'p'); 
     ->groupBy('f') 
     ->orderBy('personCount', 'DESC'); 
} 

छिपे कीवर्ड सिद्धांत 2.2 में जोड़ा गया है, इसका मतलब है कि चुने गए फ़ील्ड परिणाम में नहीं होगा, और इस मामले में है कि आप का मतलब बस अपनी इकाइयों को एक सरणी के बजाय वापस प्राप्त करें।

संदर्भ का चयन करें प्रलेखन DQL रहे हैं: http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#dql-select-examples

+0

धन्यवाद! इसे करने का यही तरीका है! – Russ

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