Arrays Yii模型到阵列?
如何将Trips::model()->findAll()的结果转换为数组?对数组使用DAOArrays Yii模型到阵列?,arrays,model,yii,Arrays,Model,Yii,如何将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->att
$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*fromtbl')->queryAll()代码>示例,除了:
- 它将向模型询问表名;您不需要在模型和查询中同时写入表名
- 您可以先调用
$model
上的函数,例如
$model=Trips::model()->short()->目的地(“德克萨斯州奥斯汀”)代码>
这样做意味着您可以使用模型的现有查询快捷方式,而不是直接将其放入查询中
相反,$trips=trips::model()->findAll()代码>(使用foreach)有点浪费,因为您从数据库中提取行,设置一堆对象,然后将它们全部扔掉。对于小的结果集,它可以很好地工作,但如果您查看的是一个很长的旅行列表,我不会使用它
警告:
但是,如果这只是一个快速原型,请务必使用createCommand()
或findAll()和循环示例
$model = Trips::model()->findAll();
$arr = CHtml::listData($model, 'trip_id', 'trip_name');
var_dump($arr);
CHtml::listData()将返回一个数组值。这是相同的
$array = CHtml::listData(Trips::model()->findAll(), 'trip_id', 'trip_name');
->结果
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的“attributes”伪属性,如下所示:
CHtml::listData(Trips::model()->findAll(), 'id', 'attributes')
我使用$array=CJSON::decode(CJSON::encode($model))
将$model转换为$array。简单易行的方法:我使用这个方法将array转换为下拉菜单,我想这会对您有所帮助。。检查此示例:
代码:
不要为此使用CHtml::listData。它必须用于其他目的。
CDbCriteria有一个索引属性,适合您的要求
//第一个选项
Trips::model()->findAll(数组('index'=>'trip_id');
//第二种选择
$c=新的CDB标准();
$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));
注意:这不是一个好方法,但会返回数组ahem,别忘了检查$trips是否为空:d$trips将始终返回数组,foreach每次都不会返回错误,即使迭代是空数组。ZaQ-如果findAll()返回空数组,在使用foreach之前检查是否为空是一种浪费。$trips=trips::model()->findAll()
与listData()
(对模型进行foreach)结合使用是一种浪费,因为您从数据库中提取行,设置一组对象,然后将它们全部丢弃。trips::model()->findAll()
与listData()
(对模型进行foreach)结合使用有点浪费,因为您从数据库中提取行,设置一组对象,然后将它们全部扔掉。即将对使用此方法的任何人实施快速警告:更改$model->dbCriteria中的select以仅获取所需的列时。。这将影响(并从中剥离)同一请求中的所有标准$model->find()调用。特别难找到虫子。@Arth:我很困惑;你是说在打电话之前直接修改$model->dbCriteria
吗?我也是,我很久以前就写过这个!我想我一定有!我不建议使用您提供的第一个解决方案。findAll方法为每一行创建模型对象,然后填充它的attributes属性。这是不必要的操作,因为您只需要数据库中的原始数据。createCommand更好。@vooD我不同意,我认为这应该被标记为正确答案。Yii是核心课程吗
$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));