नहीं, वाईआई के CDbCriteria और CActiveRecord का उपयोग करके प्रोग्रामिक रूप से एक सबक्वायरी बनाने का कोई तरीका नहीं है। ऐसा लगता है कि Query Builder की तरह कोई तरीका नहीं है।
तुम अब भी कर सकते हैं कुछ भिन्न तरीकों सबक्वेरी, तथापि:
$results = Object1::model()->findAll(array(
'condition'=>'t.field1 in (select table2.field2 from table2)')
);
तुम भी एक में शामिल हो सकते हैं (जो शायद तेजी से हो जाएगा, सबक्वेरी धीमी हो सकती है):
$results = Object1::model()->findAll(array(
'join'=>'JOIN table2 ON t.field1 = table2.field2'
);
तुम भी findAllBySql के साथ एक सीधा SQL क्वेरी कर सकते हैं:
$results = Object1::model()->findAllBySql('
select * from table1 where table1.field1 in
(select table2.field2 from table2)'
);
आप कर सकते हैं, हालांकि, पर ले ast तो जैसे इन के लिए एक अच्छा एआर शैली इंटरफेस प्रदान करते हैं:
class MyModel extends CActiveRecord {
public function getResults() {
return Object1::model()->findAll(array(
'condition'=>'t.field1 in (select table2.field2 from table2)')
);
}
}
तो जैसे कहा जाता है:
$model = new MyModel();
$results = $model->results;
एक दिलचस्प विकल्प विचार क्वेरी बिल्डर के CDbCommand या कुछ का उपयोग कर अपने सबक्वेरी बनाने के लिए किया जाएगा, और उसके बाद केवल परिणामी SQL क्वेरी स्ट्रिंग को एक CDbCritera addInCondition()
में पास करें? यह काम सुनिश्चित नहीं हैं, लेकिन यह हो सकता है:
$sql = Yii::app()->db->createCommand()
->select('*')
->from('tbl_user')
->text;
$criteria->addInCondition('columnName',$sql);
तुम हमेशा की प्रक्रिया और सबक्वेरी निर्माण किसी भी तरह के रूप में अच्छी तरह से करने के लिए आधार CDbCriteria वर्ग का विस्तार कर सकते हैं। एक अच्छा विस्तार कर सकते हैं जो आप जारी कर सकते हैं! :)
मुझे आशा है कि इससे मदद मिलती है!
धन्यवाद thaddeusmt, इस एक उदाहरण ही है, मेरी क्वेरी और भी जटिल है, और यह मिलती है साथ यह करने के लिए असंभव है, और मैं सक्रिय रिकॉर्ड का उपयोग कर इसे करना चाहते हैं, मैं होगा यह जानने के लिए कि क्या Yii में SQL का उपयोग किये बिना उप-क्वेरी बनाने का कोई तरीका है? – Youcef04
वे आपके विकल्प बहुत अधिक हैं। सभी तीन वापस CActiveRecord ऑब्जेक्ट्स, मुझे विश्वास है, तो आप तकनीकी रूप से अभी भी एआर का उपयोग कर रहे हैं। आप प्रश्नों को लपेटने के लिए एआर "स्कोप्स" का उपयोग कर सकते हैं और साथ ही साथ अपने एआर ऑब्जेक्ट्स को एक अच्छा एपीआई भी प्रदान कर सकते हैं। चूंकि जाहिर है कि आपने जो प्रश्न पूछा है वह आपका * वास्तविक * प्रश्न नहीं है, शायद आप इसे संपादित कर सकते हैं? या एक नया पूछो? तो इसका जवाब देना संभव है? – thaddeusmt
पहला विकल्प मेरा समाधान है, यह स्पष्ट था कि मैं दूसरे की तलाश में था, दूसरा विकल्प जॉइन का उपयोग करता है, जो मेरी मदद नहीं कर सकता, तीसरा कोई दिलचस्प नहीं है। मैंने सवाल संपादित किया, और मुझे उम्मीद है कि यह अब और स्पष्ट है? – Youcef04