2011-12-11 14 views
7

क्या Yii में ActiveRecord में उप-प्रश्न बनाना संभव है?उप-प्रश्न ActiveRecord Yii

select * from table1 where table1.field1 in (select table2.field2 from table2)

मैं वर्तमान में fallowing कोड का उपयोग कर रहा:

मैं इस तरह एक प्रश्न है

object1::model()->findAll(array('condition'=>'t.field1 in (select table2.field2 from table2)'))

[संपादित करें]
मैं अगर जानना चाहते हैं वहाँ एसक्यूएल का उपयोग किए बिना उप-क्वेरी बनाने का तरीका है, और जुड़ने के बिना।

क्या कोई समाधान है?

और अग्रिम धन्यवाद।

उत्तर

10
db क्षेत्रों से

प्रथम खोजने दोहरी:

$model=new MyModel('search'); 
$model->unsetAttributes(); 

$criteria=new CDbCriteria(); 
$criteria->select='col1,col2,col3'; 
$criteria->group = 'col1,col2,col3'; 
$criteria->having = 'COUNT(col1) > 1 AND COUNT(col2) > 1 AND COUNT(col3) > 1'; 

सबक्वेरी प्राप्त करें:

$subQuery=$model->getCommandBuilder()->createFindCommand($model->getTableSchema(),$criteria)->getText(); 

सबक्वेरी हालत जोड़ें:

$mainCriteria=new CDbCriteria(); 
$mainCriteria->condition=' (col1,col2,col3) in ('.$subQuery.') '; 
$mainCriteria->order = 'col1,col2,col3'; 

उपयोग कैसे करें:

$result = MyModel::model()->findAll($mainCriteria); 

या:

$dataProvider = new CActiveDataProvider('MyModel', array(
     'criteria'=>$mainCriteria, 
)); 

स्रोत: http://www.yiiframework.com/wiki/364/using-sub-query-for-doubletts/

6

नहीं, वाईआई के 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 वर्ग का विस्तार कर सकते हैं। एक अच्छा विस्तार कर सकते हैं जो आप जारी कर सकते हैं! :)

मुझे आशा है कि इससे मदद मिलती है!

+0

धन्यवाद thaddeusmt, इस एक उदाहरण ही है, मेरी क्वेरी और भी जटिल है, और यह मिलती है साथ यह करने के लिए असंभव है, और मैं सक्रिय रिकॉर्ड का उपयोग कर इसे करना चाहते हैं, मैं होगा यह जानने के लिए कि क्या Yii में SQL का उपयोग किये बिना उप-क्वेरी बनाने का कोई तरीका है? – Youcef04

+0

वे आपके विकल्प बहुत अधिक हैं। सभी तीन वापस CActiveRecord ऑब्जेक्ट्स, मुझे विश्वास है, तो आप तकनीकी रूप से अभी भी एआर का उपयोग कर रहे हैं। आप प्रश्नों को लपेटने के लिए एआर "स्कोप्स" का उपयोग कर सकते हैं और साथ ही साथ अपने एआर ऑब्जेक्ट्स को एक अच्छा एपीआई भी प्रदान कर सकते हैं। चूंकि जाहिर है कि आपने जो प्रश्न पूछा है वह आपका * वास्तविक * प्रश्न नहीं है, शायद आप इसे संपादित कर सकते हैं? या एक नया पूछो? तो इसका जवाब देना संभव है? – thaddeusmt

+0

पहला विकल्प मेरा समाधान है, यह स्पष्ट था कि मैं दूसरे की तलाश में था, दूसरा विकल्प जॉइन का उपयोग करता है, जो मेरी मदद नहीं कर सकता, तीसरा कोई दिलचस्प नहीं है। मैंने सवाल संपादित किया, और मुझे उम्मीद है कि यह अब और स्पष्ट है? – Youcef04

0

मैं इस एक पुराने धागा लेकिन शायद किसी को (मेरे जैसे) पता है अभी भी एक जवाब की जरूरत है।

पिछले उत्तरों से संबंधित एक छोटे से मुद्दे हैं। तो, यहाँ मेरी बढ़ा हुआ रूप है:

$model=new SomeModel(); 
$criteria=new CDbCriteria(); 
$criteria->compare('attribute', $value); 
$criteria->addCondition($condition); 
// ... etc 
$subQuery=$model->getCommandBuilder()->createFindCommand($model->getTableSchema(),$criteria)->getText(); 

$mainCriteria=new CDbCriteria(); 
$mainCriteria->addCondition($anotherCondition); 
// ... etc 

// NOW THIS IS IMPORTANT 
$mainCriteria->params = array_merge($criteria->params, $mainCriteria->params); 

// Now You can pass the criteria: 
$result = OtherModel::model()->findAll($mainCriteria);