column方法

column 方法

1、功能:获取符合条件记录中各列字段所组成的数组

注意有以下几个关键字:

  1. 可以是一条记录,也可以多条记录,这与value方法不同的;
  2. 返回值是一个数组,而非单值,这与value方法也不相同;
  3. 可以返回一列数据,也可返回多列数组,返回多列时以二维数组展示。

2、源码:/thinkphp/library/think/db/Query.php

3、参数与返回值:

1. 参数

序号 参数 说明
1 字段名 表中存在的字段名称
2 键名 设置数组元素的键名,默认为参数中的第一个字段名

2. 返回值

序号 参数 说明
1 一维数组 当只有$field字段参数,且只有一个字段时,键名是从0开始索引数组
2 二维数组 当字段参数参数二个时,结果自动转为二维数组,当设置了第二个参数$key时,可指定数组元素键名

4、语法:

Db::table( '数据表名' ) -> where( 查询条件 ) -> column( '字段列表', '数组键名' ) ;
  • 当字段列表不于二个字段时,结果是一维数组,键名为第一个字段
  • 当字段列表大于二个字段时,结果是二维数组,键名如不指定则为首字段
  • 如指定的键名,不在字段列表中,将做为首字段插入到字段列表中。

5、演示实例:

任务1:查询id > 1020 记录中的name字段值

  • 表中数据,红框内的是我们要操作的数据

  1. 参数只传入一个字段值时,返回一维数组;
  2. 因为没有传入指定键名,该数组的键名为默认的从0开始的索引数组
    (索引数组:由键名从0开始的连续正整数构成的数组)
  • Index.php 控制器文件:
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字段值

  1. 参数只传入二个字段名,并不设置键名时,返回一维数组;
  2. 因为没有传入指定键名,该数组的键名为参数字段列表中的第一个
  3. 返回数组类型由做键名的字段值决定,数值型就是索引数组,字符或日期型就是关联数组
  4. 本例中,字段列表是:name,age,所以数组元素格式为:['name'] => age
  • Index.php 控制器文件:
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字段值

按上面的逻辑,我们知道,二个字段时,其中一个字段值以键名方式出现在结果中,那么三个字段时,怎么办呢?
解决方案:用二维数组表示
那么问题来了?> 哪个字段应该是二维数组中,各个元素的键名呢?
是和前面案例一样,取第一个字段名吗?我们试一下,就知道了~~~

  • 现在的Index.php 控制器代码如下 :
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

我们前面一直在用默认值来设定数组的键名,其实就是可以设定的。
本例中,我们人为设定为:age

  • Index.php 控制器文件:
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) "程序员" }

我们再大胆猜想一下,能不能指定一个不在字段列表中出现的字段,当做键名呢?例如,当前字段列表是:name,age,而我们指定键名为:hiredate,是否可行?请看下面案例:

任务5:查询id > 1020 记录中的name, age字段值,指定键名为:hiredate

  • Index.php 控制器文件:
where('id > 1020') // 设置查询条件 id > 1020 // 获取满足id>1020的所有记录的name,age字段值,打包到一维数组返回 ->column('name,age','hiredate'); //查询查询结果 dump($result); } }
  • 查询结果如下(神奇一幕出现了):
  • 做为键名的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、总结:

column 方法,将查询结果以一种很灵活的方式返回,让程序员有了更大的发挥空间处理数据,一定要熟练掌握它