## 常用的链式方法
* field()用来选择需要获取的字段
> 用法:
> 第一种:filed('id,name')
> 第二种:field(['id'=>'编号','name'=>'姓名']),这种方式可以给字段起别名
* where()用来选择条件
>~~~
> 用法:
> 第一种:where('id','=',1),如果是相等关系可以省略=,我个人觉得没必要省略,保持统一
> 第二种:where([['id','=',1],['grade','>=',80]])
> 第三种:where('info->email','thinkphp@qq.com'),查询JSON类型字段(info字段为json类型)
> 第四种:where('type=1 AND status=1'),使用字符串,与第一种的区别在于不会对查询字段进行避免关键字冲突处理,建议配合预处理机制where("id=:id and username=:name", ['id' => [1, \PDO::PARAM_INT] , 'name' => 'thinkphp'])或者使用:
> Db::table('think_user')
> ->where("id=:id and username=:name")
> ->bind(['id' => [1, \PDO::PARAM_INT] , 'name' => 'thinkphp'])
> ->select();
> 也可以使用更加安全的方式:
>Db::table('think_user')
>whereRaw("id=:id and username=:name", ['id' => [1, \PDO::PARAM_INT] , 'name' => 'thinkphp'])
>select();
> ~~~
* find()用来查询数据
> 没有查询到数据返回null,查询到数据返回数据库中的第一条记录,以数组的形式返回
> 用法:
> 第一种:find()
> 第二种:find(1),这种方式可以用来在主键查询,省略where()主键条件
* findOrFail()
> 此方法没有找到数据会抛出异常
* findOrEmpty()
> 当查询不存在的时候返回空数组而不是Null
* select()用来查询多条数据
> 没有查询到数据返回一个空数组,查询到数据返回一个非空数组
> 用法:
> select()
* value()用来获取单个字段的值
> 没有查询到数据返回null,如果查询到的话返回一个字符串
> 用法:
> Db::table('test')->where('id','=',1)->value('name')
* column()用来获取某一列的值
> 用法:
> 第一种:column('name'),column('name','id')
> 第二种:column('*','id'),返回完整数据,并且添加一个索引值,指定id字段的值作为索引
* selectOrFail()
> 此方法没有找到数据会抛出异常
* insert()
> 新增单条,新增成功返回新增的条数,失败返回false
> 用法:
> 第一种:insert($data),$data为一个数组
> 第二种:insert($data,true),第二种用法使用replace into插入,并且这种方式只能使用在mysql数据库上
> insert into 和 replace into的差别:
> replace into 首先尝试插入数据到表中
> 1.如果发现表中已经有此行数据(根据主键或者唯一索引判断)则先删除此行数据,然后插入新的数据。
> 2.否则,直接插入新数据。
> 要注意的是:插入数据的表必须有主键或者是唯一索引!否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据。
* data()
> 这种用法的好处是可以进行一些基本的过滤,不过需要注意的是用了data()方法之后,insert()方法中就不能支持true
> 用法:
> data($data),$data是一个数组
* insertGetId()
> 插入的同时返回新增的id
> 一共执行了两步:第一步是插入,第二步是返回主键id
> insertGetId($data),$data是数组
* insertGetId()
> 插入的同时返回新增的id
> 一共执行了两步:第一步是插入,第二步是返回主键id
> insertGetId($data),$data是数组
* insertAll()
> 新增多条,新增成功返回新增的条数,失败返回false
> insertAll(),insertAll($data,true)
* update()
> 必须要更新条件,如果更新条件是主键的话,可以直接把主键写到更新数组中
> 同时注意,更新操作前面不能使用data()方法,更新成功返回更新的条数,没修改任何数据返回0
> 用法:
> Db::table('test')->where('id','=',1)->update($data)
> Db::table('test')->update(['id'=>2,'name'=>'就是这么强']),tp5.1会自动把id作为更新的条件
* delete()
> 删除成功返回删除数量,否则返回0
> 用法:
> delete(1),delete([1,2,3]),如果是根据主键删除的话可以在delete()方法中直接传入一个主键id,就可以成功删除了
> delete(true),不带条件调用delete()方法会提示错误,通过true可以无条件删除所有的数据
* query()
> 用来执行原生sql语句
> 用法:
> delete($sql),$sql为原生的sql语句
* table()
> 用来指定数据库表
> 用法:
> 第一种:可以指定数据库table("数据库名.完整的数据表名")
> 第二种:可以指定多张表table("表名 别名,表名 别名")
> 第三种:使用数组可以尽量避免与mysql的关键字冲突,table(['think_user'=>'user','think_role'=>'role'])
* name()
> 数据表设置了表前缀的话,可以使用name(表名)来指定表名,此时的表名不需要加上表前缀,如果没有指定表前缀的话,name()方法和table()方法是一样的使用方法
* chunk()
> 该方法用来处理成千上百条数据库记录,该方法一次获取结果集的一小块,然后填充到每一小块数据要处理的闭包,该方法在编写处理大量数据库记录的时候非常有用。
> 比如,我们可以全部用户表数据进行分批处理,每次处理 100 个用户记录:
> ~~~
> Db::table('think_user')->chunk(100, function($users) {
> foreach ($users as $user) {
> //
> }
> });
> // 或者交给回调方法myUserIterator处理
> Db::table('think_user')->chunk(100, 'myUserIterator');
>
> ~~~
> 你可以通过从闭包函数中返回`false`来中止对后续数据集的处理:
> ~~~
> Db::table('think_user')->chunk(100, function($users) {
> foreach ($users as $user) {
> // 处理结果集...
> if($user->status==0){
> return false;
> }
> }
> });
>
> ~~~
>
> 也支持在`chunk`方法之前调用其它的查询方法,例如:
>
> ~~~
> Db::table('think_user')
> ->where('score','>',80)
> ->chunk(100, function($users) {
> foreach ($users as $user) {
> //
> }
> });
>
> ~~~
>
> `chunk`方法的处理默认是根据主键查询,支持指定字段,例如:
>
> ~~~
> Db::table('think_user')->chunk(100, function($users) {
> // 处理结果集...
> return false;
> },'create_time');
>
> ~~~
>
> 并且支持指定处理数据的顺序。
>
> ~~~
> Db::table('think_user')->chunk(100, function($users) {
> // 处理结果集...
> return false;
> },'create_time', 'desc');
> ~~~
* cursor()
>~~~
> 如果需要处理大量的数据,可以使用新版提供的游标查询功能,该查询方式利用了PHP的生成器特性,可以减少大量数据查询的内存占用问题
>
> $cursor = Db::table('user')->where('status', 1)->cursor();
> foreach($cursor as $user){
> echo $user['name'];
> }
> `cursor`方法返回的是一个生成器对象,`user`变量是数据表的一条数据(数组)。
> ~~~
* strict(false)
> 通过这个方法在insert()添加数据的时候,可以过滤掉那些并不是数据库中相关字段的数据,也就是数据库中没有name这个字段,但是你添加数据的时候,添上了name这个字段的值,我就可以通过这个方法过滤掉这个字段
* limit()
> 在使用insert()插入数据的时候,可以使用limit()方法指定每次插入的数量限制,实现分批写入
* raw()
> ~~~
> 适合在数组更新的时候,raw()方法可以执行表达式或者是sql函数
> Db::name('user')
> ->where('id', 1)
> ->update([
> 'name' => Db::raw('UPPER(name)'),
> 'score' => Db::raw('score-3'),
> 'read_time' => Db::raw('read_time+1')
> ]);
> ~~~
* setField()
>~~~
>用于更新某个字段值
> Db::name('user')
> ->where('id',1)
> ->setField('name', 'thinkphp');
> ~~~
* setInc()/setDec()
~~~
// score 字段加 1
Db::table('think_user')
->where('id', 1)
->setInc('score');
// score 字段加 5
Db::table('think_user')
->where('id', 1)
->setInc('score', 5);
// score 字段减 1
Db::table('think_user')
->where('id', 1)
->setDec('score');
// score 字段减 5
Db::table('think_user')
->where('id', 1)
->setDec('score', 5);
最终生成的SQL语句可能是:
UPDATE `think_user` SET `score` = `score` + 1 WHERE `id` = 1
UPDATE `think_user` SET `score` = `score` + 5 WHERE `id` = 1
UPDATE `think_user` SET `score` = `score` - 1 WHERE `id` = 1
UPDATE `think_user` SET `score` = `score` - 5 WHERE `id` = 1
setInc/setDec支持延时更新,如果需要延时更新则传入第三个参数,下例中延时10秒更新。
Db::name('user')->where('id', 1)->setInc('score', 1, 10);
setInc/setDec 方法返回影响数据的条数,如果使用了延迟更新的话,可能会返回true
~~~
* useSoftDelete()软删除
~~~
// 软删除数据 使用delete_time字段标记删除
Db::name('user')
->where('id', 1)
->useSoftDelete('delete_time',time())
->delete();
实际生成的SQL语句可能如下(执行的是`UPDATE`操作):
UPDATE `think_user` SET `delete_time` = '1515745214' WHERE `id` =
`useSoftDelete`方法表示使用软删除,并且指定软删除字段为`delete_time`,写入数据为当前的时间戳。
~~~
* alias()
> 用来设置当前数据表的别名
> 用法:
> 第一种:Db::table('think_user')->alias('a')
> 第二种:Db::table('think_user')->alias(['think_dept'=>'dept','think_user'=>'user'])->join('think_dept','dept.user_id=user.id)