【发布时间】:2011-05-25 01:37:06
【问题描述】:
如何将Trips::model()->findAll() 的结果转换为数组?
【问题讨论】:
如何将Trips::model()->findAll() 的结果转换为数组?
【问题讨论】:
对数组使用 DAO
$array = Yii::app()->db->createCommand('SELECT * FROM tbl')->queryAll();
【讨论】:
我很确定你可以做到这一点:
$trips = Trips::model()->findAll();
$arr = array();
foreach($trips as $t)
{
$arr[$t->id] = $t->attributes;
}
我假设您将属性“id”作为模型的主键。
【讨论】:
这是正确的做法,它遵循 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 数据信息。
【讨论】:
我在这里假设您只需要检索裸数组,而不是任何关联的模型对象。
这样就可以了:
$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)有点浪费,因为您要从数据库中提取行,设置一堆对象,然后将它们全部丢弃。它适用于小型结果集,但如果您正在查看一长串旅行,我不会使用它。
警告:
不过,如果这只是一个快速原型,请务必使用 createCommand() 或 findAll()-and-loop 示例。
【讨论】:
$model->dbCriteria?
$model = Trips::model()->findAll();
$arr = CHtml::listData($model, 'trip_id', 'trip_name');
var_dump($arr);
CHtml::listData() 将返回一个数组值。
【讨论】:
$trips = Trips::model()->findAll() 与 listData() 结合使用(对模型进行 foreach)有点浪费,因为您从数据库中提取行,设置一堆物品,然后全部扔掉。
这是一样的。
$array = CHtml::listData(Trips::model()->findAll(), 'trip_id', 'trip_name');
【讨论】:
Trips::model()->findAll() 与 listData() 结合使用(对模型进行 foreach)有点浪费,因为您从数据库中提取行,设置一堆物品,然后全部扔掉。
$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
)
[...])
【讨论】:
从您的问题中假设您想要所有属性,一个更紧凑的解决方案可以为您提供所有按 id 散列的属性,您可以使用 CActiveRecord 的“属性”伪属性,如下所示:
CHtml::listData(Trips::model()->findAll(), 'id', 'attributes')
【讨论】:
我使用$array = CJSON::decode(CJSON::encode($model)); 将$model 转换为$array。
【讨论】:
简单的方法:我使用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',
)
【讨论】:
不要为此使用 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);
【讨论】:
您可以创建集合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
)
)
【讨论】:
简单使用:
$trips = Trips::model()->findAll();
$trips_array = CJSON::decode(CJSON::encode($trips));
注意:这不是好办法,而是返回数组
【讨论】: