2010-12-14 4 views
31

Làm cách nào để chuyển đổi kết quả của Trips::model()->findAll() thành một mảng?Mô hình Yii thành mảng?

+2

Về để được thực hiện https://github.com/yiisoft/yii/issues/531 – Lamy

Trả lời

1

Sử dụng DAO cho mảng

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

Tôi khá chắc chắn rằng bạn có thể làm điều này:

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

Tôi giả sử bạn có thuộc tính 'id' như khóa chính của mô hình của bạn.

+3

e hèm, đừng quên kiểm tra xem $ chuyến rỗng hay không: D – ZaQ

+1

các chuyến đi $ sẽ luôn luôn trở về một mảng, cho mỗi người sẽ không trở về lỗi ngay cả lặp là một mảng trống. – GusDeCooL

+1

ZaQ - nếu findAll() trả về một mảng trống, kiểm tra trống trước khi sử dụng foreach là một sự lãng phí. – grantwparks

23

Đây là cách đúng đắn để làm, nó sau Yii ước

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

này được sử dụng khi bạn có truy vấn phức tạp, những người bạn thấy khó khăn để tạo ra các công ước Yii.

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

Ví dụ: khi bạn cần chuyển tất cả dữ liệu từ mô hình vào mảng. Bạn không thể truyền trực tiếp nó vì nó truyền một số thông tin dữ liệu ActiveRecord mà bạn không cần.

+0

Tôi sẽ không khuyên bạn sử dụng giải pháp đầu tiên bạn cung cấp. phương thức findAll tạo đối tượng mô hình cho mỗi hàng và sau đó điền thuộc tính thuộc tính của nó. Đó là thao tác không cần thiết vì bạn chỉ cần dữ liệu thô từ cơ sở dữ liệu. createCommand là thích hợp hơn. – vooD

33

Tôi đang đi trên giả định ở đây rằng bạn chỉ cần truy xuất các mảng trống và không phải bất kỳ đối tượng mô hình được liên kết nào.

này sẽ làm điều đó:

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

này cũng giống như Yii::app()->db->createCommand('SELECT * FROM tbl')->queryAll(); ví dụ, ngoại trừ:

  • Nó sẽ hỏi mô hình cho tên bảng; bạn sẽ không cần phải viết tên bảng trong cả mô hình và truy vấn.

  • Bạn có thể gọi scoping chức năng trên $model trước, ví dụ:
    $model = Trips::model()->short()->destination('Austin, TX');
    Làm điều này có nghĩa là bạn có thể sử dụng phím tắt truy vấn hiện có của mô hình, thay vì đặt chúng trực tiếp truy vấn.

Ngược lại, $trips = Trips::model()->findAll(); (sử dụng foreach) là một chút lãng phí, trong đó bạn đang kéo hàng từ cơ sở dữ liệu, thiết lập một loạt các đối tượng, và sau đó ném đi hết thảy. Nó sẽ làm việc tốt cho các bộ kết quả nhỏ, nhưng tôi sẽ không sử dụng nó nếu bạn đang xem danh sách dài các chuyến đi.

Nên biết trước:
Nếu đây là chỉ là một nguyên mẫu nhanh chóng, tuy nhiên, bằng mọi cách sử dụng createCommand() hoặc FindAll() - ví dụ và vòng lặp.

+1

Cảnh báo nhanh cho bất kỳ ai sử dụng phương pháp này: Khi thay đổi lựa chọn trong $ model-> dbCriteria để chỉ nhận các cột tôi cần .. điều này bị ảnh hưởng (và tước các thuộc tính khác khỏi) tất cả các cuộc gọi $ model-> find() chuẩn trong cùng một yêu cầu. Lỗi đặc biệt khó tìm. – Arth

+0

@Arth: Tôi bối rối; bạn đang nói rằng bạn đang sửa đổi '$ model-> dbCriteria' trực tiếp trước khi gọi? –

+0

Tôi cũng vậy, tôi đã viết một thời gian dài trước đây! Tôi đoán tôi phải có! – Arth

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

CHtml :: listData() sẽ trả về giá trị mảng.

+3

'$ trips = Trips :: model() -> findAll()' kết hợp với 'listData()' (mà đang làm một foreach qua các mô hình) là một chút lãng phí, trong đó bạn đang kéo các hàng từ cơ sở dữ liệu, thiết lập một loạt các đối tượng, và sau đó ném chúng đi. –

13

Điều này giống nhau.

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

'Trips :: model() -> findAll()' kết hợp với 'listData()' (đang thực hiện một foreach qua các mô hình) là một chút lãng phí, trong đó bạn đang kéo các hàng từ cơ sở dữ liệu, thiết lập một loạt các đối tượng, và sau đó ném chúng đi. –

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); 

-> kết quả

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

hi, cảm ơn đây là giải pháp tốt nhất. –

2

Giả sử từ câu hỏi của bạn mà bạn muốn tất cả các thuộc tính, một giải pháp nhỏ gọn hơn để cung cấp cho bạn tất cả các thuộc tính băm bởi id, bạn có thể sử dụng 'thuộc tính CActiveRecord của 'pseudoproperty như sau:

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

tôi sử dụng $array = CJSON::decode(CJSON::encode($model)); để chuyển đổi $ model thành $ array.

+0

Thật tuyệt.Nó hoạt động –

6

Dễ dàng và cách đơn giản: tôi sử dụng listData() phương pháp để làm cho mảng để trình đơn thả xuống, và tôi nghĩ rằng điều này sẽ giúp bạn .. kiểm tra ví dụ này:

mã:

<?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); 
?> 

đầu ra:

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

Không sử dụng CHtml :: listData cho việc này. Nó phải được sử dụng cho các mục đích khác. Có một chỉ số chỉ số của CDbCriteria phù hợp với yêu cầu của bạn.

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

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

Bạn có thể tạo bộ sưu tập CMap tiếp tục làm việc với cô ấy

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

Giải pháp tốt nhất. +1. – Gogol

3

Bạn có thể sử dụng này.

$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);   
       }     
      } 

đầu ra của bạn sẽ

Array 
    (
     [0] => Array 
       (
        [trip_id] => 1 
        [name] => Nashik 
       ) 
     [1] => Array 
       (
        [trip_id] => 2 
        [name] => Puna 
       ) 
     [2] => Array 
       (
        [trip_id] => 3 
        [name] => Mumbai 
       ) 
    )