2010-12-14 12 views
31

मैं Trips::model()->findAll() के परिणाम को सरणी में कैसे परिवर्तित कर सकता हूं? सरणियोंवाईआई मॉडल सरणी के लिए?

$array = Yii::app()->db->createCommand('SELECT * FROM tbl')->queryAll(); 
+2

बारे में रिक्त है https://github.com/yiisoft/yii/issues/531 – Lamy

उत्तर

1

डीएओ उपयोग मैं बहुत आप ऐसा कर सकते हैं यकीन है:

$trips = Trips::model()->findAll(); 
$arr = array(); 
foreach($trips as $t) 
{ 
    $arr[$t->id] = $t->attributes; 
} 

मैं यह सोचते करती हूं कि आप विशेषता 'आईडी' अपने मॉडल के प्राथमिक कुंजी के रूप है।

3

के लिए

+3

अहम, मत भूलना कि क्या $ यात्राएं की जाँच करने के लागू किए जाने की या नहीं: डी – ZaQ

+1

$ ट्रिप हमेशा एक सरणी लौटाएंगे, फोरच प्रत्येक त्रुटि को वापस नहीं करेगा, फिर भी पुनरावृत्ति एक खाली सरणी है। – GusDeCooL

+1

ज़ाक्यू - यदि findAll() एक खाली सरणी देता है, तो फ़ोरैच का उपयोग करने से पहले खाली की जांच करना एक अपशिष्ट है। – grantwparks

23

यह करने के लिए सही रास्ता है, यह Yii सम्मेलनों

$trips = Trips::model()->findAll(); 
$arr = array(); 
foreach($trips as $t) 
{ 
    $arr[$t->id] = $t->attributes; 
} 

यह आपको जटिल प्रश्न है, जब प्रयोग किया जाता है, उन आप Yii परंपराओं से बनाने के लिए मुश्किल लगता है इस प्रकार है।

Yii::app()->db->createCommand('SELECT * FROM tbl')->queryAll(); 

उदाहरण के लिए, जब आपको मॉडल से सभी डेटा को सरणी में पास करने की आवश्यकता होती है। आप इसे सीधे पास नहीं कर सकते क्योंकि यह कुछ ActiveRecord डेटा जानकारी को पास करता है जिसकी आपको आवश्यकता नहीं है।

+0

मैं आपके द्वारा प्रदान किए गए पहले समाधान का उपयोग करने की अनुशंसा नहीं करता। ढूंढें सभी विधि प्रत्येक पंक्ति के लिए मॉडल ऑब्जेक्ट बनाती है और फिर इसकी विशेषता गुणों को पॉप्युलेट करती है। यह अनावश्यक ऑपरेशन है क्योंकि आपको डेटाबेस से कच्चे डेटा की आवश्यकता है। बनाएँ कमांड बेहतर है। – vooD

33

मैं इस धारणा पर जा रहा हूं कि आपको केवल नंगे सरणी पुनर्प्राप्त करने की आवश्यकता है, न कि किसी भी संबंधित मॉडल ऑब्जेक्ट्स।

यह यह करना होगा:

$model = Trips::model(); 
$trips = $model->getCommandBuilder() 
       ->createFindCommand($model->tableSchema, $model->dbCriteria) 
       ->queryAll(); 

यह Yii::app()->db->createCommand('SELECT * FROM tbl')->queryAll(); उदाहरण की तरह है, सिवाय इसके:

  • यह तालिका नाम के लिए मॉडल के लिए कहेंगे; आपको मॉडल और क्वेरी दोनों में तालिका का नाम लिखने की आवश्यकता नहीं होगी।

  • आप पहले $model पर scoping फ़ंक्शन पर कॉल कर सकते हैं, उदाहरण के लिए।
    $model = Trips::model()->short()->destination('Austin, TX');
    ऐसा करने का मतलब है कि आप सीधे क्वेरी में डालने के बजाय मॉडल के मौजूदा क्वेरी शॉर्टकट का उपयोग कर सकते हैं।

इसके विपरीत, (foreach का उपयोग) $trips = Trips::model()->findAll(); थोड़ा बेकार है, कि आप, डेटाबेस से पंक्तियों खींच रहे वस्तुओं का एक समूह की स्थापना, और फिर उन सब को दूर फेंक। यह छोटे परिणाम सेट के लिए ठीक काम करेगा, लेकिन यदि आप ट्रिप की लंबी सूची देख रहे हैं तो मैं इसका उपयोग नहीं करूंगा।

चेतावनी: - और लूप उदाहरण
बस एक त्वरित प्रोटोटाइप, हालांकि, हर तरह से createCommand() या findAll() का उपयोग इस है।

+1

इस दृष्टिकोण का उपयोग करने वाले किसी के लिए त्वरित चेतावनी: $ model-> dbCriteria में चयन को बदलने के लिए केवल मुझे आवश्यक कॉलम प्राप्त करने के लिए .. यह सभी मानक $ मॉडल-> ढूंढें() कॉल में प्रभावित (और अन्य विशेषताओं को छीन लिया) एक ही अनुरोध खोजने के लिए विशेष रूप से कठिन बग। – Arth

+0

@ अरथ: मैं उलझन में हूं; क्या आप कह रहे हैं कि आप कॉल करने से पहले '$ model-> dbCiteriter' को संशोधित कर रहे हैं? –

+0

मैं भी हूं, मैंने लिखा है कि बहुत समय पहले! मुझे लगता है कि मेरे पास होना चाहिए! – Arth

4
$model = Trips::model()->findAll(); 
$arr = CHtml::listData($model, 'trip_id', 'trip_name'); 
var_dump($arr); 

CHtml :: listData() एक सरणी मान वापस कर देगा।

+3

'$ trips = Trips :: model() -> findAll() '' listData() '(जो मॉडलों पर फ़ोरैच कर रहा है) के साथ संयोजन में थोड़ा अपमानजनक है, जिसमें आप पंक्तियां खींच रहे हैं डेटाबेस, ऑब्जेक्ट्स का एक समूह स्थापित करना, और फिर उन्हें दूर फेंकना। –

13

यह वही है।

$array = CHtml::listData(Trips::model()->findAll(), 'trip_id', 'trip_name'); 
+9

'ट्रिप्स :: मॉडल() -> findAll() '' listData() '(जो मॉडलों पर फ़ोरैच कर रहा है) के साथ संयोजन में थोड़ा अपमानजनक है, जिसमें आप डेटाबेस से पंक्तियां खींच रहे हैं, वस्तुओं का एक गुच्छा स्थापित करना, और फिर उन्हें दूर फेंकना। –

2
$cats = Category::model()->findAll(); 
$count_cats = count($cats); 
if($count_cats > 0){ 
    $arr_category = array(); 
    foreach($cats as $cat) 
     array_push($arr_category,$cat->attributes); 
} 
print_r($arr_category); 

-> परिणाम

Array(
[0] => Array 
    (
     [cat_id] => 2 
     [title] => Đương đại 
     [title_full] => Đương đại 
     [desc] => 
     [alias] => duong-dai 
     [p_id] => 0 
     [type] => 1 
     [status] => 1 
     [sort_order] => 2 
     [selected] => 0 
    ) 
[1] => Array 
    (
     [cat_id] => 164 
     [title] => Nhiệt đới 
     [title_full] => Nhiệt đới 
     [desc] => 
     [alias] => nhiet-doi 
     [p_id] => 0 
     [type] => 1 
     [status] => 1 
     [sort_order] => 0 
     [selected] => 0 
    ) 
[...]) 
+0

हाय, धन्यवाद यह सबसे अच्छा समाधान है। –

2

अपने प्रश्न से यह मानते हुए कि आप सभी विशेषताओं चाहते हैं, एक अधिक कॉम्पैक्ट समाधान आप सभी विशेषताओं आईडी से टुकड़ों में बांटा देने के लिए, आप CActiveRecord की 'विशेषताओं का उपयोग कर सकते हैं 'pseudoproperty इस प्रकार है:

CHtml::listData(Trips::model()->findAll(), 'id', 'attributes') 
2

मैं $array = CJSON::decode(CJSON::encode($model)); का उपयोग $ सरणी के लिए $ मॉडल कन्वर्ट करने के लिए।

+0

वह महान।यह –

6

आसान और सरल तरीका: मैं listData() विधि का उपयोग ड्रॉपडाउन मेनू करने के लिए सरणी बनाने के लिए, और मुझे लगता है कि यह तुम्हारी मदद करेगा .. इस उदाहरण की जाँच करें:

कोड:

<?php 
    /*you can use here any find method you think 
    proper to return your data from db*/ 
    $models = Trips::model()->findAll(); 

    // format models resulting using listData  
    $tripsArray = CHtml::listData($models, 'id', 'name');  

    print_r($tripsArray); 
?> 

उत्पादन:

array(
'1'=>'trip1', 
'2'=>'trip2', 
'3'=>'trip3', 
) 
0

इस के लिए CHtml :: listData का उपयोग न करें। इसका इस्तेमाल अन्य उद्देश्यों के लिए किया जाना चाहिए। एक इंडेक्स सीडीबीक्रिटारिया की संपत्ति है जो आपके लिए उपयुक्त है।

//1st option 
Trips::model()->findAll(array('index'=>'trip_id')); 

//2nd option 
$c = new CDbCriteria(); 
$c->index = 'trip_id'; 
Trips::model()->findAll($c); 
3

आप संग्रह CMAP बना सकते हैं उसके

$collections = new CMap(); 
foreach (YourModel::model()->findAll(['index' => 'id']) as $key => $row) { 
    $collections->add($key,$row->attributes); 
} 
var_dump($collections ->toArray()); 
+1

सर्वोत्तम समाधान काम करता है। +1। – Gogol

3

के साथ काम करने के लिए जारी आप इस का उपयोग कर सकते हैं।

$Trips::model()->findAll(array('index'=>'trip_id')); 
if(count($Trips)>0) 
      {     
       $TripsArrayList=array(); 
       foreach($Tripsas as $singleTrip) 
       {     
        $TripsArrayList[]=array('trip_id'=>$singleTrip->trip_id,'name'=>$singleTrip->name);   
       }     
      } 

आपका आउटपुट होगा

Array 
    (
     [0] => Array 
       (
        [trip_id] => 1 
        [name] => Nashik 
       ) 
     [1] => Array 
       (
        [trip_id] => 2 
        [name] => Puna 
       ) 
     [2] => Array 
       (
        [trip_id] => 3 
        [name] => Mumbai 
       ) 
    ) 
संबंधित मुद्दे