Yii模型到阵列?

时间:2010-12-14 04:32:02

标签: arrays model yii

如何将Trips::model()->findAll()的结果转换为数组?

14 个答案:

答案 0 :(得分:34)

我在这里假设你只需要检索裸阵列,而不是任何相关的模型对象。

这样做:

$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');
    这样做意味着您可以使用模型的现有查询快捷方式,而不是直接将它们放入查询中。

相比之下,$trips = Trips::model()->findAll();(使用foreach)有点浪费,因为你从数据库中提取行,设置一堆对象,然后将它们全部丢弃。它适用于小型结果集,但如果您查看很长的Trips列表,我就不会使用它。

<强>警告:
但是,如果这只是一个快速原型,请务必使用createCommand()或findAll() - 循环示例。

答案 1 :(得分:25)

这是正确的方法,它遵循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数据信息。

答案 2 :(得分:13)

这是一样的。

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

答案 3 :(得分: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',
)

答案 4 :(得分:4)

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

CHtml :: listData()将返回一个数组值。

答案 5 :(得分:3)

我很确定你能做到这一点:

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

我假设您将属性“id”作为模型的主键。

答案 6 :(得分:3)

您可以创建 CMap 集合继续与她合作

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

答案 7 :(得分: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
                 ) 
    )

答案 8 :(得分: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);

- &GT;结果

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
    )
[...])

答案 9 :(得分:2)

假设您的问题需要所有属性,一个更紧凑的解决方案,为您提供所有按ID分类的属性,您可以使用CActiveRecord的'属性'伪表,如下所示:

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

答案 10 :(得分:2)

我使用$array = CJSON::decode(CJSON::encode($model));将$ model转换为$ array。

答案 11 :(得分:1)

将DAO用于数组

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

答案 12 :(得分:0)

为此不要使用CHtml :: listData。它必须用于其他目的。 CDbCriteria有索引属性,适合您的要求。

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

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

答案 13 :(得分:0)

简单使用:

$trips = Trips::model()->findAll();

$trips_array = CJSON::decode(CJSON::encode($trips));

注意:这不是好方法,但会返回数组