2012-03-30 8 views
5

इस तरह एक प्रश्न के साथ:वाईआई: सीडीबीक्रिटिरिया के साथ ग्रुप से पहले कैसे ऑर्डर करें?

SELECT * FROM (
    SELECT * FROM message ORDER BY added_on DESC 
) as m WHERE receiver_id = 2 GROUP BY sender_id ORDER BY priority_id DESC; 

मुझे पता है कि findAllBySql का उपयोग कर यह करने के लिए:

$this->findAllBySql(
    'SELECT * FROM (
     SELECT * FROM message ORDER BY added_on DESC 
    ) as m WHERE receiver_id = :receiverId 
    GROUP BY sender_id 
    ORDER BY priority_id DESC', 
    array('receiverId' => $userId)); 

लेकिन अगर इस CDbCriteria कारण का उपयोग कर निम्न कोड करने के लिए कोई रास्ता नहीं है मैं सोच रहा था , ज़ाहिर है, काम नहीं करता है:

$criteria = new CDbCriteria(); 
$criteria->condition = 'receiver_id = :receiverId'; 
$criteria->group = 'sender_id'; 
$criteria->order = 'priority_id DESC, added_on DESC'; 
$criteria->params = array('receiverId' => $userId); 

धन्यवाद।

+0

क्या इससे मदद मिलती है? http://stackoverflow.com/questions/8467698/sub-queries-activerecord-yii –

+0

दिलचस्प है, इसलिए उस लिंक को पढ़ना सीडीबीक्रिटारिया का उपयोग करना संभव नहीं है। धन्यवाद! – Puigcerber

उत्तर

6

यदि आपके पास एक जटिल जटिल SQL क्वेरी है, तो इसे सक्रिय रिकॉर्ड में लिखने के बजाय इसे SQL में रखने का सबसे अच्छा अभ्यास है। हां यह डेटाबेस पोर्टेबिलिटी को सीमित करता है, लेकिन आपके पास शायद इन प्रश्नों का ट्यून नहीं है, और सरल और अधिक रखरखाव कोड हमेशा जीतता है।

+1

तो ऐसा लगता है कि इसे सीडीबीक्रिटिरिया का उपयोग करना संभव नहीं है और यह एकमात्र उत्तर है, मैं इसे स्वीकार कर रहा हूं। धन्यवाद। – Puigcerber

+0

एफडब्ल्यू, विशेष रूप से वाईआई (मैं कंपनी में इसके साथ काम कर रहा हूं) में कई असुविधाएं हैं जैसे कि बग के साथ मॉडल, वाईआई में सत्र, उदाहरण के लिए, सहयोगी बहु-आयामी सरणी में मानों को सहेज नहीं सकते हैं। यही कारण है कि मैंने एक बिंदु भी सेट किया है। –

+2

सवाल यह नहीं था कि जटिल एसक्यूएल क्वेरी के लिए सबसे अच्छा अभ्यास क्या है। –

10

मुझे पता है कि यह बहुत देर हो चुकी है। मुझे इसी तरह की समस्या थी, और मैं इस

$criteria = new CDbCriteria(); 
$criteria->select = '*, MAX(added_on) max_added_on'; 
$criteria->condition = 'receiver_id = :receiverId'; 
$criteria->group = 'sender_id'; 
$criteria->order = 'priority_id DESC, max_added_on DESC'; 
$criteria->params = array('receiverId' => $userId); 

की तरह पहुंचने का प्रयास करता हूं, यह मेरी समस्या का समाधान करता है। यदि आप max_added_on को पुनर्प्राप्त करना चाहते हैं, तो आपको केवल मॉडल वर्ग पर एक और संपत्ति जोड़नी होगी।