Arrays Yii模型到阵列?

Arrays 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

如何将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*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));