thinkphp数据库操作示例
<?php /** tp5.1数据库操作学习 */ namespace app\index\controller; use think\Controller; use think\Db; use think\Exception; use think\Facade\Request; //use think\Db; class XueDb extends Controller { public function find() { /** 查询单条数据 使用find 方法 * 如果没找到结果,返回null, 否则返回结果数组 */ $row = Db::table('zh_user')->where('is_admin', '=', 1)->find(); dump($row); } /** 如果希望在没有找到数据后抛出异常可以使用 findOrFail */ public function findOrFail($id = 1, $name = '') { strlen(Request::param('id')) ? $id = Request::param('id') : null; $row = Db::name('user')->where('id', $id)->findOrFail(); dump($row); } /** V5.1.23+版本开始,支持findOrEmpty方法,当查询不存在的时候返回空数组而不是Null。 */ public function findOrEmpty($name = '') { strlen(Request::param('name')) ? $name = Request::param('name') : null; $row = Db::name('user')->where('name', 'like', "%$name%")->findOrEmpty(); dump($row); } /** * 查询多条数据(数据集)使用 select 方法 * 默认情况下,find和select方法返回的都是数组,区别在于后者是二维数组。 */ public function select() { $rows = Db::name('user')->select(); dump($rows); // dump(count($rows)); } /** * 助手函数 * tp51提供了一个 db 助手函数,可以更方便查询 * db()函数的第一个参数的作用和 name 方法一样(传入不带前缀的表名), 如果需要使用不同的数据库连接, * 可以传入数据库配置作为第二个参数 如:db('user','db_config1')->where('id',1')->find(); */ public function dbFun() { $row = db('user')->where('id', 1)->find(); //返回一条数据 dump($row); } public function dbFun1() { $rows = db('user', 'db_local')->where('is_admin', 1)->select(); dump($rows); } /** 值与列查询 */ public function value($id = 1) { /** 查询某个字段的值 */ /** 使用value()方法 根据 ID 查询 姓名,如果未匹配到数据 返回 null **/ Request::param('id') ? $id = Request::param('id') : null; $v = Db::name('user')->where('id', $id)->value('name'); dump($v); } public function column($is_admin = '') { /** 查询某一列的值 */ strlen(Request::param('is_admin')) ? $is_admin = Request::param('is_admin') : null; $column = Db::connect('db_local')->name('user')->where('is_admin', $is_admin)->column('name'); dump($column); //返回一个数组 } public function column1($is_admin = '') { strlen(Request::param('is_admin')) ? $is_admin = Request::param('is_admin') : null; $column = Db::name('user')->where('is_admin', $is_admin)->column('name', 'id'); dump($column); //返回由 id 为key的数组 ,也可以指定其它字段为key } public function column2($is_admin = '') { strlen(Request::param('is_admin')) ? $$is_admin = Request::param('is_admin') : null; $column = Db::connect('db_local')->name('user')->where('is_admin', $is_admin)->column('*', 'id'); dump($column); //返回由 id 为key的二维数组 } /** * 数据分批处理 * 如果要处理成百上千条数据库记录,可以使用 chunk 方法,一次获取结果集的一小块, * 填充到要处理的闭包,些方法在编写处理大量数据库记录的时候非常有用. * 可以通过从闭包函数中返回 false 来中止后续数据的处理. */ public function chunk() { Db::name('user') ->where('is_admin', 0) ->field('id,name,is_admin') ->chunk(100, function ($users) { foreach ($users as $user) { dump($user); if ($user['id'] == 1200) { return false; } //code here } }, 'id', 'desc'); } /** * 大批量数据处理 * 如果需要处理大量的数量,可以使用新版提供的游标查询功能,该查询 方式利用了php的生成器特性,可以大幅减少大量数据查询 的内存占用问题 * */ public function cursor() { $cursor = Db::name('user')->where('is_admin', 0)->cursor(); foreach ($cursor as $user) { echo $user['name'] . '<br>'; } } /** * JSON类型数据查询( mysql ) */ public function json() { $row = Db::name('device') ->where('info->deviceid', '000008') ->find(); echo($row['info']); } public function json1() { $rs = Db::table('zh_device') ->json(['info']) ->where('info->customer', '小泥吧科技') ->find(); dump($rs); } public function jsonUpdate() { // $data['info->customer']='xiaoniba'; $rs = Db::table('zh_device') ->where('deviceid', '000008') ->json(['info']) ->update([ // 'info->customer' => '小泥吧科技', // 'info->desc' => '小泥吧公司财务机', 'info->motherboard' => '技嘉主板', ]); dump($rs); } /** * where()方法支持,原生sql查询 对于一些实在复杂的查询,也可以直接使用原生SQL语句进行查询,例如: */ public function sql($id = 1, $xin = '') { $id = Request::param('id'); $xin = Request::param('xin'); $rs = Db::name('user') ->where("id > $id AND name LIKE '$xin%'") ->select(); for ($i = 0; $i < count($rs); $i++) { echo $rs[$i]['id'] . '--' . $rs[$i]['name'] . '<br>'; } } /** 为了安全起见,我们可以对字符串查询条件使用参数绑定,例如: */ public function safeSql($id = 1, $xin = '') { $id = Request::param('id'); $xin = Request::param('xin'); $rs = Db::name('user') ->whereRaw("id > :id AND name LIKE :name", ["id" => $id, "name" => $xin . '%']) ->select(); for ($i = 0; $i < count($rs); $i++) { echo $rs[$i]['id'] . '--' . $rs[$i]['name'] . '<br>'; } } /** * 还有两个原生查询方法 query()和execute() * query方法用于执行SQL查询操作,如果数据非法或者查询错误则返回false,否则返回查询结果数据集(同select方法)。 * execute用于更新和写入数据的sql操作,如果数据非法或者查询错误则返回false,否则返回影响的记录数。 *支持在原生查询的时候使用参数绑定,包括问号占位符或者命名占位符 */ public function query() { $id = Request::param('id'); $name = Request::param('name'); $rs = Db::query( "SELECT * FROM zh_user WHERE id > :id AND name LIKE :name", ['id' => $id, 'name' => "$name%"] ); for ($i = 0; $i < count($rs); $i++) { echo $rs[$i]['id'] . '--' . $rs[$i]['name'] . '<br>'; } } public function execute() { $id = Request::param('id'); $name = Request::param('name'); $mobile = Request::param('mobile'); $r = Db::execute( "update zh_user set name=:name ,mobile=:mobile where id=:id", ['name' => $name, 'mobile' => $mobile, 'id' => $id] ); } function callback($query) { echo "操作成功"; dump($query); } /** * ************************************************添加数据******************************** */ public function insert() { $data = [ 'name' => '石博華', 'email' => 'shibohua@qq.com', 'mobile' => '17312345678', 'create_time' => time(), 'update_time' => time(), ]; $rs = Db::name('user')->insert($data); dump($rs); } /** 如果数据包含不存在的字段 insert()会抛出异常,如果想忽略不存在的字段,可以调用strict(false) */ public function insert1() { $data = [ 'name' => '石博華111', 'email' => 'shibohua@qq.com', 'mobile' => '17312345678', 'create_time' => time(), 'update_time' => time(), 'aa_time' => time(), //数据库不存在此字段 ]; $rs = Db::name('user')->strict(false)->insert($data); dump($rs); } public function insert2() { /** 如果是mysql数据库,支持replace写入 */ $data = [ 'name' => '张三', 'email' => 'zhangsan@xiaoniba.com', 'mobile' => '13845544548', 'create_time' => time(), ]; $rs = Db::name('user')->insert($data, true); echo "插入{$rs}条数据 " . date('m-d H:i:s', time()); } /** 添加数据后如果需要返回新增数据的自增主键,使用 insertGetId 方法 */ public function insertGetId() { $data = [ 'name' => '张三', 'email' => 'zhangsan@xiaoniba.com', 'mobile' => '13845544548', 'create_time' => time(), ]; $id = Db::name('user')->insertGetId($data); echo "本条数据id为{$id},插入时间:" . date('m-d H:i:s'); } /** 添加多条数据直接向 Db 类的 insertAll 方法传入需要添加的数据即可 */ public function insertAll() { $data = [ ['name' => '小可爱' . rand(1000, 9000), 'email' => 'xiaokeai' . rand(1000, 9000) . '@xnb.me', 'mobile' => '138' . rand(10000000, 99999999), 'create_time' => time(),], ['name' => '小可爱' . rand(1000, 9000), 'email' => 'xiaokeai' . rand(1000, 9000) . '@xnb.me', 'mobile' => '138' . rand(10000000, 99999999), 'create_time' => time(),], ['name' => '小可爱' . rand(1000, 9000), 'email' => 'xiaokeai' . rand(1000, 9000) . '@xnb.me', 'mobile' => '138' . rand(10000000, 99999999), 'create_time' => time(),], ['name' => '小可爱' . rand(1000, 9000), 'email' => 'xiaokeai' . rand(1000, 9000) . '@xnb.me', 'mobile' => '138' . rand(10000000, 99999999), 'create_time' => time(),], ['name' => '小可爱' . rand(1000, 9000), 'email' => 'xiaokeai' . rand(1000, 9000) . '@xnb.me', 'mobile' => '138' . rand(10000000, 99999999), 'create_time' => time(),], ]; // $rs = Db::name('user')->insertAll($data); // $rs = Db::name('user')->insertAll($data,true); /** 如果是mysql 支持replace 写入 */ /** 也可以使用 data() 方法 */ // $rs = Db::name('user')->data($data)->insertAll(); /** 如果数据比较多,可以分批插入,使用 limit() 指定每次插入的数量限制 */ $rs = Db::name('user')->data($data)->limit(2)->insertAll(); dump($rs); /** insertAll()返回添加数据的条数 */ } /** 更新数据 */ public function update() { $rows = Db::name('user')->where('id', 2728)->update(['name' => 'xiaoxiao1', 'update_time' => time()]); dump($rows); /** update()方法返回影响数据的条数,没修改任何数据 返回 0 */ } /** 也可使用 data() 方法传入数据 */ public function update1() { $data = [ 'name' => '小蜜', 'update_time' => time(), ]; $rs = Db::name('user')->data($data)->where('id', '>', 2700)->update(); dump($rs); } /** 如果 数据中包含主键,可不用where() */ public function update2() { $rs = Db::name('user')->update(['id' => 2681, 'mobile' => 88888888]); dump($rs); } /** 如果要更新的数据需要使用 sql 函数或者其它字段,可以使用下面的方式 */ public function update3() { $rs = Db::name('user') ->where('id', 2681) ->inc('level', 2) ->dec('update_time', 1000) ->exp('name', 'UPPER(name)') ->update(); dump($rs); } /** V5.1.7+ 以后的版本,支持使用 raw 方法进行数据更新,适合在数组更新的情况 */ public function update4() { Db::name('user') ->where('id', 2681) ->update([ 'name' => Db::raw('UPPER(name)'), 'level' => Db::raw('level+3'), 'update_time' => Db::raw('update_time+3600'), ]); } /** 更新字段值 */ public function update5() { $rs = Db::name('user') ->where('level', 2) ->setField('level', '0'); dump($rs); } /** setInc/setDec 方法自增或自减一个字段的值(如不加第二个参数,默认步长为1) ,传入第三个参数支延时更新 */ public function update6() { $rs = Db::name('user') ->where('id', 2681) ->setInc('level', 2, 2); dump($rs); } /** *******************************删除数据 **************************************/ /** delete()返回删除的条数,,没有匹配数据返回 0 * 不带条件调用 delete()方法会提示错误,如果 确实需要删除所有数据 ,可台使用 delete(true); */ public function del($id = '') { $id = intval(Request::param('id')); $rs = Db::name('user')->delete($id); if ($rs > 0) { echo "删除了{$rs}条数据 ." . date('Y-m-d H:i:s', time()); } else { echo '未删除数据' . date('Y-m-d H:i:s', time()); } } public function del1() { $id = Db::name('user')->order('id', 'desc')->find()['id']; $rs = Db::name('user')->where('id', $id)->delete(); dump($rs); } public function del2() { Db::table('think_user')->where('id', 1)->delete(); Db::table('think_user')->where('id', '<', 10)->delete(); } public function softDel() { $id = Db::name('user')->order('id', 'desc')->find()['id']; $rs = Db::name('user')->where('id', $id)->useSoftDelete('delete_time', time())->delete(); dump($rs); } /** 查询事件 *数据库的CURD操作支持事件,包括: * before_select before_find after_insert after_update after_delete * 查询事件仅支持 find select insert update 和 delete 方法 * 用 Db::event('事件','回调函数')注册事件 * 查询事件的方法参数只有一个:当前的查询对象。但你可以通过依赖注入的方式添加额外的参数。 */ // public function evnTest(){ // Db::event('after_insert', 'callback'); // Db::event('before_select', function ($query) { // // 事件处理 // return $result; // }); // } /** 获取器 *Db类也可以支持获取器定义, * withAttr方法可以多次调用,对多个字段定义获取器。 */ public function dbHuoQuQi() { $rs = Db::name('user') ->withAttr('email', function ($value, $data) { return strtoupper($value); }) ->limit(20) ->select(); foreach ($rs as $v) { echo '<pre>'; echo $v['id'] . '--' . $v['name'] . ' : ' . $v['email'] . '<br>'; echo '</pre>'; } } }
版权声明:
作者:xiaoniba
链接:https://blog.xiaoniba.com/2019/08/22/thinkphp%e6%95%b0%e6%8d%ae%e5%ba%93%e6%93%8d%e4%bd%9c%e7%a4%ba%e4%be%8b/
来源:小泥吧的博客
文章版权归作者所有,未经允许请勿转载。
THE END
二维码
共有 0 条评论