【问题标题】:Yii - How to get a values array from an Active RecordYii - 如何从活动记录中获取值数组
【发布时间】:2012-03-11 17:33:50
【问题描述】:

使用 Yii,我如何从 Active Record 中获取数组。

这样说:

array('foo', 'bar', 'lala')

从这样的事情:

MyTable::model()->findall()

【问题讨论】:

  • 什么是foo、bar和lala?表/模型或不同模型对象的属性?
  • 您是想问如何将条件、参数等用于 findAll 函数?
  • 价值观。我想从表中获取数组 o 值。例如,包含国家/地区的表中的国家/地区数组。

标签: arrays activerecord yii


【解决方案1】:

如果我理解正确的话:

$users = User::model()->findAll();
$usersArr = CHtml::listData( $users, 'id' , 'name');
print_r( $usersArr );

它会给你数组 id => 名称

Array {
    2 => 'someone',
    20 => 'kitty',
    102 => 'Marian',
    // ...
}

【讨论】:

  • 是的,我想到了,但没有办法只使用“名称”吗?
  • 如果只想用名字,key应该没问题吧?如果需要,您可以使用 array_values 重置键。
  • 天哪! CHtml 作为数组获取!麦盖弗!
【解决方案2】:

不要使用 ActiveRecord。使用CDBCommand->queryColumn()

【讨论】:

  • 嗯... Django 有这个:docs.djangoproject.com/en/dev/ref/models/querysets/#values-list 为什么 Yii 不能也有这个?
  • 如果您对 ActiveRecord 使用任何 beforeFind 或 afterFind 方法,这将(显然)不会调用它们。例如,我在 beforeFind 中进行了一些未在 queryColumn 中调用的预过滤,因此我们得到的结果比预期的要多。幸运的是,我们已经进行了一些测试来捕捉这样的事情,否则这会在生产过程中伤害我们。
  • 问题是关于从 MyTable::model()->findall() 中获取实际数据;所以,答案是无关紧要的
  • 答案离题。 OP 询问有关将 ActiveRecord 的结果转换为数组的问题。不是以数组的形式从数据库中查询数据。
【解决方案3】:

ActiveRecord 类有一个名为attributes 的属性。你可以在这里找到它的描述:http://www.yiiframework.com/doc/api/1.1/CActiveRecord#attributes-detail

要获取数组中的所有属性,请使用:$var = $model->attributes;

【讨论】:

    【解决方案4】:

    你也可以这样做

    $countries = Country::model()->findAll();
    array_values(CHtml::listData($countries, 'country_id', 'country_name'));
    

    返回所有国家名称的数组,或

    array_keys(CHtml::listData($countries, 'country_id', 'country_name'));
    

    返回一个包含所有国家/地区 ID 的数组。

    【讨论】:

      【解决方案5】:

      使用 Chtml 这是一个丑陋的黑客!应用此解决方案是我发现的更好的方法:

      public function queryAll($condition = '', $params = array())
      {
          $criteria = $this->getCommandBuilder()->createCriteria($condition, $params);
          $this->applyScopes($criteria);
          $command = $this->getCommandBuilder()->createFindCommand($this->getTableSchema(), $criteria);
          $results = $command->queryAll();
          return $results;
      }
      

      您可以将此代码添加到 ActiveRecord 类中,例如:

      class ActiveRecord extends CActiveRecord {
      //...
      }
      

      并且,使用这种方式:

      return $model->queryAll($criteria);
      

      您可以在this link阅读更多信息。

      【讨论】:

      • 请注意 link-only answers 是不鼓励的,所以答案应该是寻找解决方案的终点(而不是另一个参考中途停留,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。
      【解决方案6】:

      怎么样:

      Yii::app()->db->createCommand()
          ->setFetchMode(PDO::FETCH_COLUMN,0)
          ->select("mycolumn")
          ->from(MyModel::model()->tableSchema->name)
          ->queryAll();
      

      结果是:

      array('foo', 'bar', 'lala')
      

      【讨论】:

        【解决方案7】:

        对于 yii2 ,使用:

        yii\helpers\ArrayHelper::map(MyModel::find()->all(), 'id', 'name'));
        

        yii\helpers\ArrayHelper::getColumn(MyModel::find()->all(), 'name'));
        

        【讨论】:

          【解决方案8】:

          如果您使用的是 Yii1.1,并且您需要从 AR 获取所有数据作为数组,您需要自己关心它。 Yii1.1 AR 没有开箱即用的这个功能

          在 Yii2 AR 中有asArray() 方法,非常有用

          希望我的回答对大家有所帮助

          【讨论】:

          • 提供一个例子可能会有所帮助。
          【解决方案9】:

          通过将Yii2 ArrayHelper 包含到您的控制器中,这会将模型数据转换为关联的数组

              use yii\helpers\ArrayHelper; 
          
              $post = ArrayHelper::toArray(ClientProfilesForm::findOne(['id' => 1]));
          
          //or use it directly by 
          
              $post = yii\helpers\ArrayHelper::toArray(ClientProfilesForm::findOne(['id' => 1]));
          

          【讨论】:

            【解决方案10】:
            Model::find()->select('id')->column();
            

            将返回 ID 数组。

            【讨论】:

              猜你喜欢
              • 2014-03-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-12-04
              • 2013-03-27
              • 1970-01-01
              • 1970-01-01
              • 2012-07-05
              相关资源
              最近更新 更多