如何将 Trips::model()->findAll() 的结果转换为数组?
Trips::model()->findAll()
我在这里假设您只需要检索裸阵列,而不是任何关联的模型对象 .
这样做:
$model = Trips::model(); $trips = $model->getCommandBuilder() ->createFindCommand($model->tableSchema, $model->dbCriteria) ->queryAll();
这就像 Yii::app()->db->createCommand('SELECT * FROM tbl')->queryAll(); 示例,除了:
Yii::app()->db->createCommand('SELECT * FROM tbl')->queryAll();
它会询问模型的表名;您不需要在模型和查询中编写表名 .
您可以先在 $model 上调用scoping函数,例如 .$model = Trips::model()->short()->destination('Austin, TX');这样做意味着您可以使用模型的现有查询快捷方式,而不是直接将它们放入查询中 .
$model
$model = Trips::model()->short()->destination('Austin, TX');
相比之下, $trips = Trips::model()->findAll(); (使用foreach)有点浪费,因为你可以很好地处理小的结果集,但是我不会看到很长的Trips列表 .
$trips = Trips::model()->findAll();
Caveat:但是,如果这只是一个快速原型,请务必使用 createCommand() 或findAll() - 循环示例 .
createCommand()
这是正确的方法,它遵循Yii惯例
$trips = Trips::model()->findAll(); $arr = array(); foreach($trips as $t) { $arr[$t->id] = $t->attributes; }
当您遇到复杂查询时,会使用此选项,这些查询很难使用Yii约定创建 .
例如,当您需要将模型中的所有数据传递给数组时 . 您无法直接传递它,因为它传递了您不需要的一些ActiveRecord数据信息 .
这是一样的 .
$array = CHtml::listData(Trips::model()->findAll(), 'trip_id', 'trip_name');
简单方便:我使用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', )
$model = Trips::model()->findAll(); $arr = CHtml::listData($model, 'trip_id', 'trip_name'); var_dump($arr);
CHtml :: listData()将返回一个数组值 .
我很确定你能做到这一点:
我假设您将属性“id”作为模型的主键 .
您可以创建集合 CMap 继续与她合作
$collections = new CMap(); foreach (YourModel::model()->findAll(['index' => 'id']) as $key => $row) { $collections->add($key,$row->attributes); } var_dump($collections ->toArray());
你可以用它 .
$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 ) )
$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 ) [...])
从你的问题中假设你想要所有的属性,一个更紧凑的解决方案为你提供所有属性哈希值,你可以使用CActiveRecord的'属性'伪表,如下所示:
CHtml::listData(Trips::model()->findAll(), 'id', 'attributes')
我使用 $array = CJSON::decode(CJSON::encode($model)); 将$ model转换为$ array .
$array = CJSON::decode(CJSON::encode($model));
将DAO用于数组
$array = Yii::app()->db->createCommand('SELECT * FROM tbl')->queryAll();
不要使用CHtml :: listData . 它必须用于其他目的 . CDbCriteria的 index 属性适合您的要求 .
//1st option Trips::model()->findAll(array('index'=>'trip_id')); //2nd option $c = new CDbCriteria(); $c->index = 'trip_id'; Trips::model()->findAll($c);
使用简单:
$trips = Trips::model()->findAll(); $trips_array = CJSON::decode(CJSON::encode($trips));
Note: 这不是好方法但返回数组
14 回答
我在这里假设您只需要检索裸阵列,而不是任何关联的模型对象 .
这样做:
这就像
Yii::app()->db->createCommand('SELECT * FROM tbl')->queryAll();
示例,除了:它会询问模型的表名;您不需要在模型和查询中编写表名 .
您可以先在
$model
上调用scoping函数,例如 .$model = Trips::model()->short()->destination('Austin, TX');
这样做意味着您可以使用模型的现有查询快捷方式,而不是直接将它们放入查询中 .
相比之下,
$trips = Trips::model()->findAll();
(使用foreach)有点浪费,因为你可以很好地处理小的结果集,但是我不会看到很长的Trips列表 .Caveat:
但是,如果这只是一个快速原型,请务必使用
createCommand()
或findAll() - 循环示例 .这是正确的方法,它遵循Yii惯例
当您遇到复杂查询时,会使用此选项,这些查询很难使用Yii约定创建 .
例如,当您需要将模型中的所有数据传递给数组时 . 您无法直接传递它,因为它传递了您不需要的一些ActiveRecord数据信息 .
这是一样的 .
简单方便:我使用listData()方法将数组设置为下拉菜单,我想这会对你有帮助..查看这个例子:
码:
输出:
CHtml :: listData()将返回一个数组值 .
我很确定你能做到这一点:
我假设您将属性“id”作为模型的主键 .
您可以创建集合 CMap 继续与她合作
你可以用它 .
你的输出将是
从你的问题中假设你想要所有的属性,一个更紧凑的解决方案为你提供所有属性哈希值,你可以使用CActiveRecord的'属性'伪表,如下所示:
我使用
$array = CJSON::decode(CJSON::encode($model));
将$ model转换为$ array .将DAO用于数组
不要使用CHtml :: listData . 它必须用于其他目的 . CDbCriteria的 index 属性适合您的要求 .
使用简单:
Note: 这不是好方法但返回数组