【问题标题】:How can I recieve array using Yii ActiveRecord如何使用 Yii ActiveRecord 接收数组
【发布时间】:2012-08-14 09:43:10
【问题描述】:

考虑这个查询及其结果:

Yii::app()->db->createCommand(
    "SELECT name FROM users WHERE city='Paris'"
)->queryColumn();

结果:

Array
(
    [0] => John Kerry
    [1] => Marry White
    [2] => Mike Jain
)

关于如何使用ActiveRecord 构建此查询有什么建议吗? 需要接收数组

【问题讨论】:

标签: arrays activerecord yii


【解决方案1】:

复制: Yii - How to get a values array from an Active Record

使用CHtml::listData(见http://www.yiiframework.com/wiki/48/by-example-chtml/#hh3

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

它会给你数组 id => 城市

Array {
    2 => 'Paris',
    102 => 'Riga',
    // ...
}

【讨论】:

  • 混搭!请参阅@Telvin Nguyen 的答案。但更好的是使用匿名函数从 findAll 中提取结果作为数组。
【解决方案2】:

一条活动记录,顾名思义,将为数据库中的每一行返回一条完整的记录,因此从每一行仅获取一个字段的最佳方法是使用 querybuilder 与您所拥有的类似的东西多于。

如果您真的想使用 AR 并且只想要数组中的名称,那么这样的方法可能会起作用:

$names = array();
$users = users::model()->findAllByAttributes(array('city'=>'Paris'));
foreach(array_keys($users) as $key)
{
    $names[] = $users[$key]->name;
}

虽然如果您不使用 AR 搜索中的任何其他详细信息,仅提取名称会产生很多开销。

【讨论】:

    【解决方案3】:

    实际上我已经处理过同样的问题,我想使用 ActiveRecord 而不是 CDBCommand。我之前回答过类似的问题

    get array from active record

    $words = Word::model()->findAll();
    $data=array_map(create_function('$m','return $m->getAttributes();'),$words);
    var_dump($data);
    

    【讨论】:

    • ActiveRecord 不返回对象吗? array_map 期望参数 2 是一个数组 - 但由于 $words 是一个对象,我们得到一个错误。 (?)
    • @Steven CActiveRecord 包含 findall 方法返回找到的记录数组。如果没有找到,则返回一个空数组。在我的示例中,$words 变量始终是一个数组。
    【解决方案4】:

    如前所述,您可以使用 findAllByAttributes(array $attributes, mixed $condition='', array $params=array ( )) 并告诉此方法仅获取它的记录的“名称”列火柴。为此,您需要将 CDbCriteria 的实例作为 $condition 传递,并在此实例上指定“选择”列。

    【讨论】:

      【解决方案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;
      }
      

      this link 中关注我对其他问题中相同问题的回答。

      【讨论】:

        猜你喜欢
        • 2023-04-11
        • 1970-01-01
        • 1970-01-01
        • 2013-01-06
        • 2014-12-16
        • 1970-01-01
        • 2017-05-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多