ThinkPHP5开发连载三十之数据库查询构造器链式操作的方法一

上一篇文章讲解“数据库查询构造器-链式操作”,本篇文章讲解“数据库查询构造器-链式操作的方法一”。

一、where

where方法的用法是ThinkPHP查询语言的精髓,也是ThinkPHP ORM的重要组成部分和亮点所在,可以完成包括普通查询、表达式查询、快捷查询、区间查询、组合查询在内的查询操作。where方法的参数支持的变量类型包括字符串、数组和闭包。

和where方法相同用法的方法还包括whereOr、whereIn等一系列快捷查询方法,下面仅以where为例说明用法。

1. 表达式查询

表达式查询是官方推荐使用的查询方式。

更多的表达式查询语法,可以参考前面的查询表达式部分。

新建Index控制器,并新建expQuery方法

预览:

2. 数组条件

可以通过数组方式批量设置查询条件,使用方式如下:

在Index控制器中,新建arrQuery方法,使用数组条件查询。

预览:

注意:

1. 5.1的数组查询方式有所调整,是为了尽量避免数组方式的条件查询注入。

$where = [

['name','like','%2%'],//查询name字段值包含2

['cid','=',2]//查询cid=2

];

$data = Db::table('think_user')->where($where)->select();

3. 字符串条件

在Index控制器中,新建strQuery方法:

预览:

注意:

1. 注意使用字符串查询条件和表达式查询的一个区别在于,不会对查询字段进行避免关键词冲突处理。

二、table

table方法主要用于指定操作的数据表。

一般情况下,操作模型的时候系统能够自动识别当前对应的数据表,所以,使用table方法的情况通常是为了:

切换操作的数据表;

对多表进行操作;

1)table的基本使用

在Index控制器中,新建tableQuery方法:

预览:

2)切换操作的数据库

新建数据库tp_test,并在数据库中新建表city,在表中录入一点数据

修改Index控制器中的tableQuery方法:

预览:

注意:

1. 需要注意的是table方法不会改变数据库的连接,所以你要确保当前连接的用户有权限操作相应的数据库和数据表。

2. table方法指定的数据表需要完整的表名,但可以采用name方式简化数据表前缀的传入:

例如:Db::name('user')->where('status > 1')->select();

会自动获取当前模型对应的数据表前缀来生成think_user数据表名称。

3)多表操作

基本使用

修改Index控制器下的tableQuery方法:

预览:

使用数组方式定义

为了尽量避免和mysql的关键字冲突,可以建议使用数组方式定义。

修改Index控制器下的tableQuery方法,使用数组方式定义:

预览:

注意:

1. 使用数组方式定义的优势是可以避免因为表名和关键字冲突而出错的情况。

三、alias

alias用于设置当前数据表的别名,便于使用其他的连贯操作例如join方法等。

1)基本使用

在Index控制器中,新建aliasQuery方法:

预览:

2)传入数组批量设置数据表以及别名

修改Index控制器下的aliasQuery方法:

预览:

四、field

field方法主要作用是标识要返回或者操作的字段,可以用于查询和写入操作。

1. 用于查询

1)指定字段

在查询操作中field方法是使用最频繁的。

基本使用

在Index控制器中,新建fieldQuery方法:

预览:

给某个字段设置别名

修改Index控制器下的fieldQuery方法:

预览:

注意:

1. 取别名时,可以使用as或不用,例如:

使用as:name as 用户名

不用as:name 用户名

2. 使用SQL函数

可以在field方法中直接使用函数。

修改Index控制器下的fieldQuery方法:

预览:

注意:

1. 除了select方法之外,所有的查询方法,包括find等都可以使用field方法。

V5.1.7+版本开始,如果需要使用SQL函数,推荐使用下面的方式:

修改Index控制器下的fieldQuery方法:

预览:

3. 使用数组参数

field方法的参数可以支持数组。

1)使用数组参数的基本使用

修改Index控制器下的fieldQuery方法:

预览:

2)数组方式的定义可以为某些字段定义别名

修改Index控制器下的fieldQuery方法:

预览:

3)处理复杂字段

对于一些更复杂的字段要求,数组的优势则更加明显。

修改Index控制器下的fieldQuery方法:

预览:

注意:

1. 对于带有复杂SQL函数的字段需求必须使用数组方式。

4. 获取所有字段

如果有一个表有非常多的字段,需要获取所有的字段(这个也许很简单,因为不调用field方法或者直接使用空的field方法都能做到)。

修改Index控制器下的fieldQuery方法:

预览:

但是这并不是获取所有字段,而是显式的调用所有字段(对于对性能要求比较高的系统,这个要求并不过分,起码是一个比较好的习惯),下面的用法可以完成预期的作用:

修改Index控制器下的fieldQuery方法:

预览:

注意:

1. field(true)的用法会显式的获取数据表的所有字段列表,哪怕你的数据表有100个字段。

5. 字段排除

如果我希望获取排除数据表中的content字段(文本字段的值非常耗内存)之外的所有字段值,我们就可以使用field方法的排除功能。

1)排除一个字段

修改Index控制器下的fieldQuery方法:

预览:

2)排除多个字段

修改Index控制器下的fieldQuery方法:

预览:

注意:

1. 注意的是字段排除功能不支持跨表和join操作。

6. 用于写入

除了查询操作之外,field方法还有一个非常重要的安全功能--字段合法性检测。field方法结合数据库的写入方法使用就可以完成表单提交的字段合法性检测。

修改Index控制器下的fieldQuery方法:

预览:

注意:

1. field('name,cid')表示表单中的合法字段只有name和cid字段,无论用户通过什么手段更改或者添加了浏览器的提交字段,都会直接屏蔽。因为,其他所有字段我们都不希望由用户提交来决定,你可以通过自动完成功能定义额外需要自动写入的字段。

2. 在开启数据表字段严格检查的情况下,提交了非法字段会抛出异常,可以在数据库设置文件中设置:

// 关闭严格字段检查

'fields_strict'=>false,

【例2】关闭严格字段检查

数据库配置文件(config/database.php)中fields_strict配置项默认为true,开启严格字段检查,开启后提交了非法字段会抛出异常,如果关闭严格字段检查,提交非法字段不会抛出异常,会将非法字段过滤后插入合法的数据到数据库。

修改数据库配置文件(config/database.php),关闭严格字段检查:

重新访问fieldQuery方法:

插入数据后的数据库:

ThinkPHP5连载为卓象程序员原创,转载请联系卓象程序员

关注卓象程序员,定期发布技术文章

下一篇讲解“查询构造器-链式操作的方法二”

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180830A0G9PT00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券