【问题标题】:Yii model to array?Yii模型到数组?
【发布时间】:2011-05-25 01:37:06
【问题描述】:

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

【问题讨论】:

标签: arrays model yii


【解决方案1】:

对数组使用 DAO

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

【讨论】:

    【解决方案2】:

    我很确定你可以做到这一点:

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

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

    【讨论】:

    • 咳咳,别忘了检查 $trips 是否为空:D
    • $trips 将始终返回一个数组,foreach each 不会返回错误,即使迭代是一个空数组。
    • ZaQ - 如果 findAll() 返回一个空数组,那么在使用 foreach 之前检查空数组是一种浪费。
    【解决方案3】:

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

    【讨论】:

    • 我不建议使用您提供的第一个解决方案。 findAll 方法为每一行创建模型对象,然后填充它的 attributes 属性。这是不必要的操作,因为您只需要来自数据库的原始数据。 createCommand 更可取。
    • @vooD 我不同意,我认为这应该被标记为正确答案。
    【解决方案4】:

    我在这里假设您只需要检索裸数组,而不是任何关联的模型对象。

    这样就可以了:

    $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- >find() 在同一个请求中调用。特别难找的错误。
    • @Arth:我很困惑;你是说在打电话之前直接修改$model->dbCriteria
    • 我也是,很久以前写的!我想我一定有!
    【解决方案5】:
    $model = Trips::model()->findAll(); 
    $arr = CHtml::listData($model, 'trip_id', 'trip_name');
    var_dump($arr);
    

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

    【讨论】:

    • $trips = Trips::model()->findAll()listData() 结合使用(对模型进行 foreach)有点浪费,因为您从数据库中提取行,设置一堆物品,然后全部扔掉。
    【解决方案6】:

    这是一样的。

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

    【讨论】:

    • Trips::model()->findAll()listData() 结合使用(对模型进行 foreach)有点浪费,因为您从数据库中提取行,设置一堆物品,然后全部扔掉。
    【解决方案7】:
    $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
        )
    [...])
    

    【讨论】:

      【解决方案8】:

      从您的问题中假设您想要所有属性,一个更紧凑的解决方案可以为您提供所有按 id 散列的属性,您可以使用 CActiveRecord 的“属性”伪属性,如下所示:

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

      【讨论】:

        【解决方案9】:

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

        【讨论】:

          【解决方案10】:

          简单的方法:我使用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',
          )
          

          【讨论】:

            【解决方案11】:

            不要为此使用 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);
            

            【讨论】:

              【解决方案12】:

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

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

              【讨论】:

                【解决方案13】:

                你可以用这个。

                $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
                                 ) 
                    )
                

                【讨论】:

                  【解决方案14】:

                  简单使用:

                  $trips = Trips::model()->findAll();
                  
                  $trips_array = CJSON::decode(CJSON::encode($trips));
                  

                  注意:这不是好办法,而是返回数组

                  【讨论】:

                  • CJSON 是 Yii 核心类
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2017-09-04
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多