ThinkPHP 5实战
上QQ阅读APP看书,第一时间看更新

5.3 使用查询构造器

在5.2节的内容中演示了如何通过原生SQL操作数据库,在实际的开发过程中,这种操作用得比较少,原因是手写原生SQL不太方便,容易写错,而ThinkPHP 5为了方便开发者提供了查询构造器。

查询构造器使用Builder(建造者模式,设计模式的一种)设计,而建造者模式最大的特点就是支持链式调用。如下示例就是链式操作的一种:

     A::b()->c()->d();

其实实现起来也不难,只要在b/c/d方法执行结束后return当前类实例即可。

查询构造器的基本使用(以CURD为例)在后面介绍。

5.3.1 添加数据

  •  添加一条数据
        Db::table('user')->insert(['username'=>'admin','password'=>md5('
     111111')]);
  •  添加多条数据
     Db::table('user')->insertAll([
         ['username'=>'admin','password'=>md5('111111')],
         ['username'=>'admin1','password'=>md5('123456')]
     ]);

5.3.2 更新数据

  •  根据指定条件更新数据
        Db::table('user')->where('username','admin')->update(['password'
     =>md5('123456')]);
  •  待更新数据中包含主键更新数据
         Db::table('user')->update(['admin_id'=>1,'password'=>md5('123456
     ')]);
  •  更新指定字段
         Db::table('user')->where('username','admin')->setField('password
     ',md5('111111'));
  •  自增一个字段(比如文章增加点击量)
     Db::table('article')->where('article_id',1)->setInc('hit',1);
  •  自减一个变量(比如扣除库存)
     Db::table('user')->where('goods)Id,1)->setDec('stock',1);

5.3.3 查询数据

  •  查询一条数据
     Db::table('user')->where('username','admin')->find();
  •  查询多条数据
     Db::table('user')->where('sex','male')->select();
  •  查询指定记录的某个字段值
    Db::table('user')->where('username','admin')->value('last_login'
);
  •  查询某一列数据
     Db::table('user')->where('sex','male')->column('user_id');
  •  批量查询

当数据库数据比较多而服务器内存有限制时可以使用,通过循环来降低资源占用:

  •  JSON查询

MySQL5.7中新增了JSON类型,作用和MongoDB类似,可以存储非结构化数据。ThinkPHP 5同样也支持JSON类型的查询中。在如下示例中,params为JSON类型:

     Db::table('user')->where('params$.phone','13333333333')->find();

请注意params后的$号。

5.3.4 删除数据

  •  根据主键删除
     Db::table('user')->delete([1,2,3]);
  •  根据where删除
     Db::table('user')->where('username','admin')->delete();