Yii2如何获取数据库表中指定列的所有值
Yii 1.x 读取指定表单列所有值实现方案
你当前使用的getTableNames()属于数据库Schema层的元数据查询方法,仅能获取库表结构信息,不会读取表内存储的业务数据,要读取iab_categories表category_name列的所有值,有两种常用实现方式:
方法1:使用CDbCommand查询构造器(推荐,性能最优)
直接通过数据库连接实例构造查询,调用queryColumn()方法直接返回单字段值的一维数组,没有多余数据开销:
$connection = Yii::app()->db; // 构造查询:仅查询目标列,自动适配配置的表前缀 $categoryNames = $connection->createCommand() ->select('category_name') ->from('iab_categories') ->queryColumn(); // 输出结果:$categoryNames是包含所有category_name值的一维数组 var_export($categoryNames);
queryColumn()是Yii提供的专用结果集提取方法,会自动从查询结果中拉取指定第一列的所有值,不需要手动遍历结果集拆解字段,比通用的queryAll()更省内存。
方法2:使用ActiveRecord模型查询(适合已有对应AR模型的场景)
如果你已经为iab_categories表生成了继承CActiveRecord的模型类,可以用AR语法查询,注意需要手动从返回的模型对象中提取字段值:
// 替换为你项目中对应表的实际模型类名 $categoryModels = IabCategories::model()->findAll([ 'select' => 'category_name' // 仅查询目标字段,避免查全表浪费性能 ]); // 从模型对象数组中提取目标列值 $categoryNames = array_map(function($model){ return $model->category_name; }, $categoryModels);
注意事项
- 禁止无意义的全表查询(即不要写
select *),只拉取需要的category_name字段,数据量大时性能差距非常明显 - 如需对结果去重,在查询链中调用
->distinct()即可,会自动生成SELECT DISTINCT语法返回不重复的分类名 - 如需加过滤条件,直接在查询链上追加
where()方法即可,示例:// 例:查询status为1的启用状态分类名称 $categoryNames = $connection->createCommand() ->select('category_name') ->from('iab_categories') ->where('status = :status', [':status' => 1]) ->queryColumn();
内容的提问来源于stack exchange,提问作者Regular User
相关产品推荐
相关产品推荐

