企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## 常用的链式方法 * 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)