thinkphp v5 链式操作篇
1. 查询表达式
表达式 | 含义 |
---|---|
EQ、= | 等于(=) |
NEQ、<> | 不等于(<>) |
GT、> | 大于(>) |
EGT、>= | 大于等于(>=) |
LT、< | 小于(<) |
ELT、<= | 小于等于(<=) |
LIKE | 模糊查询 |
[NOT] BETWEEN | (不在)区间查询 |
[NOT] IN | (不在)IN 查询 |
[NOT] NULL | 查询字段是否(不)是NULL |
[NOT] EXISTS | EXISTS查询 |
EXP | 表达式查询,支持SQL语法 |
> time | 时间比较 |
< time | 时间比较 |
between time | 时间比较 |
notbetween time | 时间比较 |
2. where/whereOr
- 可以使用where方法进行AND条件查询:
Db::table('think_user')
->where('name','like','%thinkphp')
->where('status',1)
->find();
- 多字段相同条件的AND查询可以简化为如下方式:
Db::table('think_user')
->where('name&title','like','%thinkphp')
->find();
- 使用whereOr方法进行OR查询:
Db::table('think_user')
->where('name','like','%thinkphp')
->whereOr('title','like','%thinkphp')
->find();
- 多字段相同条件的OR查询可以简化为如下方式:
Db::table('think_user')
->where('name|title','like','%thinkphp')
->find();
- 混合查询
where方法和whereOr方法在复杂的查询条件中经常需要配合一起混合使用,下面举个例子:
$result = Db::table('think_user')->where(function ($query) {
$query->where('id', 1)->whereor('id', 2);
})->whereOr(function ($query) {
$query->where('name', 'like', 'think')->whereOr('name', 'like', 'thinkphp');
})->select();
生成SQL语句为:
SELECT * FROM 'think_user' WHERE ( 'id' = 1 OR 'id' = 2 ) OR ( 'name' LIKE 'think' OR 'name' LIKE 'thinkphp' )
- where也支持数组条件和字符串条件
$map['id'] = ['>',1];
$map['mail'] = ['like','%thinkphp@qq.com%'];
Db::table('think_user')->where($map)->select(); //数组条件
Db::table('think_user')->where('type=1 AND status=1')->select(); //字符串
3. table
- table方法中指定数据库:
table('数据库名.表名')
需要改用户名有权限访问
- 多表进行进行操作
Db::field('user.name,role.title')
->table(['think_user'=>'user','think_role'=>'role'])
->limit(10)->select();
4. alias
alias用于设置当前数据表的别名,便于使用其他的连贯操作例如join方法等。可以是数组(v5.0.2+指定多个表的别名)和字符串(当前表的别名)
Db::table('think_user')->alias('a')->join('__DEPT__ b ','b.user_id= a.id')->select();
Db::table('think_user')->alias(['think_user'=>'user','think_dept'=>'dept'])->join('think_dept','dept.user_id= user.id')->select();
5. field
返回或者操作的字段
- 用于查询
- 指定字段
Db::table('think_user')->field('id,title,content')->select();//字符串 Db::table('think_user')->field(['id','title','content'])->select();//数组
- 设置别名
Db::table('think_user')->field('id,nickname as name')->select(); Db::table('think_user')->field(['id','nickname'=>'name'])->select();
- 使用SQL函数(数组方式的可变性更大些)
Db::table('think_user')->field('id,SUM(score)')->select(); Db::table('think_user')->field(['id','concat(name,"-",id)'=>'truename','LEFT(title,7)'=>'sub_title'])->select();
- 字段排除
如果我希望获取排除数据表中的content字段(文本字段的值非常耗内存)之外的所有字段值,我们就可以使用field方法的排除功能,例如下面的方式就可以实现所说的功能:
Db::table('think_user')->field('content',true)->select();
- 用于写入——字段合法性检测
Db::table('think_user')->field('title,email,content')->insert($data);
即表示表单中的合法字段只有title,email和content字段,无论用户通过什么手段更改或者添加了浏览器的提交字段,都会直接屏蔽。因为,其他是所有字段我们都不希望由用户提交来决定,你可以通过自动完成功能定义额外的字段写入。
在开启数据表字段严格检查的情况下,提交了非法字段会抛出异常,可以在数据库设置文件中设置:
// 关闭严格字段检查,默认开启
'fields_strict' => false,
6. order
Db::table('think_user')->where('status=1')->order('id desc,status')->limit(5)->select();
如果没有指定desc或者asc排序规则的话,默认为asc。
7. limit
主要用于指定查询和操作的数量
Db::table('think_user')
->where('status=1')
->field('id,name')
->limit(10)
->select();
8. page
分页查询:page(页码数,每页数量)
// 查询第一页数据
Db::table('think_article')->page('1,10')->select();
9. group
用于结合合计函数,根据一个或多个列对结果集进行分组
Db::table('think_user')
->field('user_id,test_time,username,max(score)')
->group('user_id,test_time')
->select();
生成的SQL语句是:
SELECT user_id,test_time,username,max(score) FROM think_score GROUP BY user_id,test_time
10. having
用于配合group方法完成从分组的结果中筛选
Db::table('think_user')
->field('username,max(score)')
->group('user_id')
->having('count(test_time)>3')
->select();
生成的SQL语句是:
SELECT username,max(score) FROM think_score GROUP BY user_id HAVING count(test_time)>3
having方法只有一个参数,并且只能使用字符串
11. join
用于根据两个或多个表中的列之间的关系,从这些表中查询数据。
join通常有下面几种类型,不同类型的join操作会影响返回的数据结果。
- INNER JOIN: 等同于 JOIN(默认的JOIN类型),如果表中有至少一个匹配,则返回行
- LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
- RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
- FULL JOIN: 只要其中一个表中存在匹配,就返回行(mysql好像是不支持的)
object join ( mixed join [, mixed $condition = null [, string $type = 'INNER']] )
举例:
Db::table('think_artist')
->alias('a')
->join('think_work w','a.id = w.artist_id')
->join('think_card c','a.card_id = c.id')
->select();
默认采用INNER JOIN 方式,如果需要用其他的JOIN方式,可以改成
Db::table('think_user')->alias('a')->join('word w','a.id = w.artist_id','RIGHT')->select();
表名也可以是一个子查询
$subsql = Db::table('think_work')->where(['status'=>1])->field('artist_id,count(id) count')->group('artist_id')->buildSql();//buildSql()生成sql语句
Db::table('think_user')->alias('a')->join([$subsql=> 'w'], 'a.artist_id = w.artist_id')->select();
12. UNION
UNION操作用于合并两个或多个 SELECT 语句的结果集(不重复的,允许重复的可以使用第二个参数)。
Db::field('name')
->table('think_user_0')
->union('SELECT name FROM think_user_1')
->union('SELECT name FROM think_user_2')
->select();
UNION ALL 操作
Db::field('name')
->table('think_user_0')
->union('SELECT name FROM think_user_1',true)
->union('SELECT name FROM think_user_2',true)
->select();
13. distinct
方法用于返回结果集中不重复的值
$subsql = Db::table('cms_user')->distinct(true)->field('user_name')->select();
dump(subsql );
返回:
14. cache
cache方法用于查询缓存操作
cache可以用于select、find、value和column方法,以及其衍生方法,使用cache方法后,在缓存有效期之内不会再次进行数据库查询操作,而是直接获取缓存中的数据,关于数据缓存的类型和设置可以参考缓存部分。缓存默认是永久,这点需要注意的
'cache' => [
// 驱动方式
'type' => 'File',
// 缓存保存目录
'path' => CACHE_PATH,
// 缓存前缀
'prefix' => '',
// 缓存有效期 0表示永久缓存
'expire' => 0,
],
示例:
不加任何设置
Db::table('think_user')->cache(60)->find();//不建议使用,建议带上便签或者标识,因为我现在的版本默认的在更新和删除里面数据的时候不会删除缓存。
添加标识
$result = Db::table('think_user')->cache('key',60)->find();
$data = \think\Cache::get('key');//获取缓存
支持设置缓存标签
Db::table('think_user')->cache('key',60,'tagName')->find();
-
缓存自动更新
缓存自动更新,是指当删除或者更新数据时,会自动删除对应缓存,(但是不能删除无标签和无标识的,我的版本是5.0.10)。
Db::table('cms_user')->update(['id'=>1,'user_name'=>'thinkphp2']);//更改数据,先执行下面两条,在执行词条,然后在执行下面两条
$subsql = Db::table('cms_user')->distinct(true)->cache('name',true)->field('user_name')->select();//生成缓存
return json_encode($subsql);//页面输出数据
页面输出:
[{"user_name":"thinkphp2"},{"user_name":"yan2"},{"user_name":"yan"}]
15. fetchSql
fetchSql用于直接返回SQL而不是执行查询,适用于任何的CURD操作方法。
$result = Db::table('think_user')->fetchSql(true)->find(1);
输出result结果为: (SELECT * FROM think_user where id = 1)
16. bind
bind方法用于手动参数绑定,大多数情况,无需进行手动绑定,系统会在查询和写入数据的时候自动使用参数绑定。
// 用于查询
Db::table('think_user')
->where('id',':id')
->where('name',':name')
->bind(['id'=>[10,\PDO::PARAM_INT],'name'=>'thinkphp'])
->select();
// 用于写入
Db::table('think_user')
->bind(['id'=>[10,\PDO::PARAM_INT],'email'=>'thinkphp@qq.com','name'=>'thinkphp'])
->where('id',':id')
->update(['name'=>':name','email'=>':email');
作者:呦丶耍脾气
链接:https://www.jianshu.com/p/fa0380f25159