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');
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,100评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,308评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,718评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,275评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,376评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,454评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,464评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,248评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,686评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,974评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,150评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,817评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,484评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,140评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,374评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,012评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,041评论 2 351

推荐阅读更多精彩内容