## column 方法 ### 1、功能:获取符合条件记录中各列字段所组成的数组 >[info] 注意有以下几个关键字: > 1. 可以是一条记录,也可以多条记录,这与value方法不同的; > 2. 返回值是一个数组,而非单值,这与value方法也不相同; > 3. 可以返回一列数据,也可返回多列数组,返回多列时以二维数组展示。 ### 2、源码:/thinkphp/library/think/db/Query.php ![](https://box.kancloud.cn/1cfdb8f2b90ba3ab0fd3675fa7637332_1304x842.png) ### 3、参数与返回值: #### 1. 参数 | 序号 | 参数 | 说明 | | --- | --- | --- | | 1 | 字段名 | 表中存在的字段名称 | | 2 | 键名 | 设置数组元素的键名,默认为参数中的第一个字段名 | #### 2. 返回值 | 序号 | 参数 | 说明 | | --- | --- | --- | | 1 | 一维数组 | 当只有$field字段参数,且只有一个字段时,键名是从0开始索引数组 | | 2 | 二维数组 | 当字段参数参数二个时,结果自动转为二维数组,当设置了第二个参数$key时,可指定数组元素键名 | ### 4、语法: ~~~ Db::table( '数据表名' ) -> where( 查询条件 ) -> column( '字段列表', '数组键名' ) ; ~~~ >[success] * 当字段列表不于二个字段时,结果是一维数组,键名为第一个字段 > * 当字段列表大于二个字段时,结果是二维数组,键名如不指定则为首字段 > * 如指定的键名,不在字段列表中,将做为首字段插入到字段列表中。 * * * * * ### 5、演示实例: #### 任务1:查询id > 1020 记录中的name字段值 * 表中数据,红框内的是我们要操作的数据 ![](https://box.kancloud.cn/cc02c1c036fc3d16dfb31268c1843716_781x382.png) >[info] >1. 参数只传入一个字段值时,返回一维数组; >2. 因为没有传入指定键名,该数组的键名为默认的从0开始的索引数组 (索引数组:由键名从0开始的连续正整数构成的数组) * Index.php 控制器文件: ~~~ <?php namespace app\index\controller; //导入数据库类 use think\Db; class Index { public function index() { //1.返回name字段值数组的索引数组,键名为从0开始的整型连续数字 $result = Db::table('tp5_staff') //设置当前数据表tp5_staff ->where('id > 1020') // 设置查询条件 id > 1020 // 获取满足id>1020的所有记录的name字段值,打包到一维索引数组返回 ->column('name'); //查询查询结果 dump($result); } } ~~~ * 运行结果: ~~~ //结果为一维数组,键名为默认的数定索引,键值是name字段值 array(5) { [0] => string(6) "梦姑" [1] => string(9) "段王爷" [2] => string(9) "鲁大师" [3] => string(9) "程序员" [4] => string(6) "方方" } ~~~ * * * * * #### 任务2:查询id > 1020 记录中的name, age字段值 >[info] >1. 参数只传入二个字段名,并不设置键名时,返回一维数组; >2. 因为没有传入指定键名,该数组的键名为参数字段列表中的第一个 >3. 返回数组类型由做键名的字段值决定,数值型就是索引数组,字符或日期型就是关联数组 >4. 本例中,字段列表是:name,age,所以数组元素格式为:['name'] => age * Index.php 控制器文件: ~~~ <?php namespace app\index\controller; //导入数据库类 use think\Db; class Index { public function index() { //1.返回name字段值数组的索引数组,键名为从0开始的整型连续数字 $result = Db::table('tp5_staff') //设置当前数据表tp5_staff ->where('id > 1020') // 设置查询条件 id > 1020 // 获取满足id>1020的所有记录的name,age字段值,打包到一维数组返回 ->column('name,age'); //查询查询结果 dump($result); } } ~~~ * 运行结果: ~~~ array(5) { // 第一个字段名自动转为键名,第二个字段为值 ["梦姑"] => int(18) ["段王爷"] => int(90) ["鲁大师"] => int(60) ["程序员"] => int(42) ["方方"] => int(90) } ~~~ * 现在我们调整一下colume参数中的字段顺序 ~~~ //将age 调整到 name 的前面 ->column('age,name'); ~~~ * 现在查询结果是: ~~~ //可以看到结果,恰好与上面是相反的,键名与值交换了位置 array(4) { [18] => string(6) "梦姑" [90] => string(6) "方方" [60] => string(9) "鲁大师" [42] => string(9) "程序员" } ~~~ * * * * * #### 任务3:查询id > 1020 记录中的name, age,hiredate字段值 >[info] 按上面的逻辑,我们知道,二个字段时,其中一个字段值以键名方式出现在结果中,那么三个字段时,怎么办呢? >解决方案:<span style="color:red">用二维数组表示</span><br/> >那么问题来了?> 哪个字段应该是二维数组中,各个元素的键名呢? > 是和前面案例一样,取第一个字段名吗?我们试一下,就知道了~~~ * 现在的Index.php 控制器代码如下 : ~~~ <?php namespace app\index\controller; //导入数据库类 use think\Db; class Index { public function index() { //1.返回name字段值数组的索引数组,键名为从0开始的整型连续数字 $result = Db::table('tp5_staff') //设置当前数据表tp5_staff ->where('id > 1020') // 设置查询条件 id > 1020 // 获取满足id>1020的所有记录的name,age字段值,打包到一维数组返回 ->column('name,age,hiredate'); //查询查询结果 dump($result); } } ~~~ * 运行结果如下: ~~~ // 二维数组中,每个数组元素的键名,就是字段列表中的第一个字段名 array(5) { ["梦姑"] => array(3) { ["name"] => string(6) "梦姑" ["age"] => int(18) ["hiredate"] => string(10) "2012-10-10" } ["段王爷"] => array(3) { ["name"] => string(9) "段王爷" ["age"] => int(90) ["hiredate"] => string(10) "2015-12-31" } ["鲁大师"] => array(3) { ["name"] => string(9) "鲁大师" ["age"] => int(60) ["hiredate"] => string(10) "2012-09-09" } ["程序员"] => array(3) { ["name"] => string(9) "程序员" ["age"] => int(42) ["hiredate"] => string(10) "2008-12-29" } ["方方"] => array(3) { ["name"] => string(6) "方方" ["age"] => int(90) ["hiredate"] => string(10) "2015-12-31" } } ~~~ * * * * * #### 任务4:查询id > 1020 记录中的name, age字段值,指定键名为:age >[info] 我们前面一直在用默认值来设定数组的键名,其实就是可以设定的。 >本例中,我们人为设定为:age * Index.php 控制器文件: ~~~ <?php namespace app\index\controller; //导入数据库类 use think\Db; class Index { public function index() { //1.返回name字段值数组的索引数组,键名为从0开始的整型连续数字 $result = Db::table('tp5_staff') //设置当前数据表tp5_staff ->where('id > 1020') // 设置查询条件 id > 1020 // 获取满足id>1020的所有记录的name,age字段值,打包到一维数组返回 ->column('name,age','age'); //查询查询结果 dump($result); } } ~~~ * 运行结果: ~~~ //这和前面,通过人为调整字段顺序,设定键名的结果是一样的 //显然,这种试更加的灵活 array(4) { [18] => string(6) "梦姑" [90] => string(6) "方方" [60] => string(9) "鲁大师" [42] => string(9) "程序员" } ~~~ * * * * * >[warning] 我们再大胆猜想一下,能不能指定一个不在字段列表中出现的字段,当做键名呢?例如,当前字段列表是:name,age,而我们指定键名为:hiredate,是否可行?请看下面案例: #### 任务5:查询id > 1020 记录中的name, age字段值,指定键名为:hiredate * Index.php 控制器文件: ~~~ <?php namespace app\index\controller; //导入数据库类 use think\Db; class Index { public function index() { //1.返回name字段值数组的索引数组,键名为从0开始的整型连续数字 $result = Db::table('tp5_staff') //设置当前数据表tp5_staff ->where('id > 1020') // 设置查询条件 id > 1020 // 获取满足id>1020的所有记录的name,age字段值,打包到一维数组返回 ->column('name,age','hiredate'); //查询查询结果 dump($result); } } ~~~ * 查询结果如下(神奇一幕出现了): >[success] * 做为键名的hiredate字段,原本不在字段列表中,现在却自动被添加到字段列表中并显示出来了。 > * 所以,当前的字段列表变成了: hiredate,name,age,因为你指定的键名是hiredate,所以这个hiredate字段,也理所当然的排到字段列中的第一位 ~~~ //指定的键名,自动插入到当前字前列表的第一位 //因为超过了二个字段,因为结果是二维数组 array(4) { ["2012-10-10"] => array(3) { ["hiredate"] => string(10) "2012-10-10" ["name"] => string(6) "梦姑" ["age"] => int(18) } ["2015-12-31"] => array(3) { ["hiredate"] => string(10) "2015-12-31" ["name"] => string(6) "方方" ["age"] => int(90) } ["2012-09-09"] => array(3) { ["hiredate"] => string(10) "2012-09-09" ["name"] => string(9) "鲁大师" ["age"] => int(60) } ["2008-12-29"] => array(3) { ["hiredate"] => string(10) "2008-12-29" ["name"] => string(9) "程序员" ["age"] => int(42) } } ~~~ ### 6、总结: >[info] column 方法,将查询结果以一种很灵活的方式返回,让程序员有了更大的发挥空间处理数据,一定要熟练掌握它