考虑此查询及其结果:
Yii::app()->db->createCommand(
"SELECT name FROM users WHERE city='Paris'"
)->queryColumn();
结果:
Array
(
[0] => John Kerry
[1] => Marry White
[2] => Mike Jain
)
有关如何使用ActiveRecord
构建此查询的任何建议?
必须接收数组。
答案 0 :(得分:7)
重复: 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',
// ...
}
答案 1 :(得分:1)
一个活动记录,按其名称,将返回数据库中每一行的整个记录,因此从每一行获取一个字段的最佳方法是使用querybuilder,就像你的那样我们上面了。
如果您真的想使用AR并且只想在数组中使用该名称,那么这样的事情可能会起作用:
$names = array();
$users = users::model()->findAllByAttributes(array('city'=>'Paris'));
foreach(array_keys($users) as $key)
{
$names[] = $users[$key]->name;
}
如果您没有使用AR搜索中的任何其他详细信息,那么仅仅提取名称会产生大量开销。
答案 2 :(得分:1)
其实我已经解决了同样的问题,我想使用ActiveRecord而不是CDBCommand。
之前我已回答了类似的问题$words = Word::model()->findAll();
$data=array_map(create_function('$m','return $m->getAttributes();'),$words);
var_dump($data);
答案 3 :(得分:0)
如前所述,您可以使用findAllByAttributes(数组$ attributes,mixed $ condition ='',array $ params = array())并告诉此方法仅获取“name”列的记录它匹配。为此,您需要将$ CDbCriteria的实例作为$ condition传递,并在此实例中指定'select'列。
答案 4 :(得分:0)
使用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中,按照我对其他问题的相同问题的回答。