《ThinkPHP 5.0快速入门》 数据库、查询语言
1、数据库配置
return [ 'type' => 'mysql',// 数据库类型 'hostname' => '127.0.0.1',// 服务器地址 'database' => 'test',// 数据库名 'username' => 'root',// 数据库用户名 'password' => '',// 数据库密码 'hostport' => '',// 数据库连接端口 'params' => [],// 数据库连接参数 'charset' => 'utf8',// 数据库编码默认采用utf8 'prefix' => '',// 数据库表前缀 'debug' => true,// 数据库调试模式 ];
//长连接使用
return [ 'database' => 'demo', // 数据库名 'prefix' => 'think_', // 数据库表前缀 'params' => [ // 数据库连接参数 // 使用长连接 \PDO::ATTR_PERSISTENT => true, ], ];
//模块的数据库配置文件中只需要配置和全局数据库配置文件差异的部分,相同的不需要重复配置。
2、原生查询:包括query和execute,分别用于查询和写入
$result = Db::execute('insert into think_data (id, name ,status) values (5, "thinkphp",1)');// 增 $result = Db::execute('delete from think_data where id = 5 ');// 删 $result = Db::execute('update think_data set name = "framework" where id = 5 ');// 改 $result = Db::query('select * from think_data where id = 5');// 查
//切换数据库查询 'db1' => [ // 数据库配置1 ... ], 'db2' => [ // 数据库配置2 ... ], // 链接 Db::connent('db1')->query('select * from think_users'); Db::connent('db2')->query('select * from think_data');
3、查询构造器
// 插入记录 Db::name('data') ->insert(['id' => 18, 'name' => 'thinkphp']); // 更新记录 Db::name('data') ->where('id', 18) ->update(['name' => "framework"]); // 查询数据$list = Db::name('data') ->where('id', 18) ->select();
// 删除数据 Db::name('data') ->where('id', 18) ->delete();
// 插入多条记录
Db::name('data')
->insertAll([['id'=>19,'name'=>'张三'],['id'=>20,'name'=>'李四'],...]);
//db
助手函数默认会每次重新连接数据库,因此应当尽量避免多次调用。
4、链式操作:链式操作不分前后,但必须在select()等操作前面
// 查询十个满足条件的数据 并按照id倒序排列 $list = Db::name('data') ->where('status', 1) ->field('id,name') ->order('id', 'desc') ->limit(10) ->select();
5、事务支持
...
6、查询语言
1、某个字段是否等于某个值 $result = Db::name('data') ->where('id', 1) ->find(); SQL:SELECT * FROM `think_data` WHERE `id` = 1 2、查询id大于等于1的数据 $result = Db::name('data') ->where('id', '>=', 1) ->limit(10) ->select(); SQL:SELECT * FROM `think_data` WHERE `id` >= 1 LIMIT 10 3、查询某个字段是否为NULL $result = Db::name('data') ->where('name', 'null') ->select(); SQL:SELECT * FROM `think_data` WHERE `name` IS NULL 4、批量查询 $result = Db::name('data') ->where([ 'id' => ['between', '1,3'], 'name' => ['like', '%think%'], ])->select(); SQL:SELECT * FROM `think_data` WHERE `id` BETWEEN '1' AND '3' AND `name` LIKE '%think%' 5、快捷查询 $result = Db::name('data') ->where('id&status', '>', 0) ->limit(10) ->select(); SQL:SELECT * FROM `think_data` WHERE ( `id` > 0 AND `status` > 0 ) LIMIT 10 6、视图查询 $result = Db::view('user','id,name,status') ->view('profile',['name'=>'truename','phone','email'],'profile.user_id=user.id') ->where('status',1) ->order('id desc') ->select(); SQL:SELECT user.id,user.name,user.status,profile.name AS truename,profile.phone,profile.email FROM think_user user INNER JOIN think_profile profile ON profile.user_id=user.id WHERE user.status = 1 order by user.id desc 7、闭包查询:find、select $result = Db::name('data')->select(function ($query) { $query->where('name', 'like', '%think%') ->where('id', 'in', '1,2,3') ->limit(10); }); SQL:SELECT * FROM `think_data` WHERE `name` LIKE '%think%' AND `id` IN ('1','2','3') LIMIT 10
7、获取某列数据
$list = Db::name('data') ->where('status', 1) ->column('name'); array (size=5) 0 => string 'thinkphp'1 => string 'onethink'2 => string 'topthink'3 => string 'kancloud'
$list = Db::name('data') ->where('status', 1) ->column('name', 'id'); array (size=5) 1 => string 'thinkphp'2 => string 'onethink'3 => string 'topthink'4 => string 'kancloud'
$list = Db::name('data') ->where('status', 1) ->column('*', 'id'); array (size=5) 1 => array (size=3) 'id' => int 1'name' => string 'thinkphp''status'=> int 12 => array (size=3) 'id' => int 1'name' => string 'onethink''status'=> int 13 => array (size=3) 'id' => int 1'name' => string 'topthink''status'=> int 14 => array (size=3) 'id' => int 1'name' => string 'kancloud''status'=> int 1
8、聚合查询
// 统计data表的数据 $count = Db::name('data') ->where('status', 1) ->count();// 统计user表的最高分 $max = Db::name('user') ->where('status', 1) ->max('score');
9、字符串查询
$result = Db::name('data') ->where('id > :id AND name IS NOT NULL', ['id' => 10]) ->select(); SQL:SELECT * FROM `think_data` WHERE ( id > '10' AND name IS NOT NULL )
10、时间查询
// 查询创建时间大于2016-1-1的数据 $result = Db::name('data') ->whereTime('create_time', '>', '2016-1-1') ->select();// 查询本周添加的数据 $result = Db::name('data') ->whereTime('create_time', '>', 'this week') ->select();// 查询最近两天添加的数据 $result = Db::name('data') ->whereTime('create_time', '>', '-2 days') ->select();// 查询创建时间在2016-1-1~2016-7-1的数据 $result = Db::name('data') ->whereTime('create_time', 'between', ['2016-1-1', '2016-7-1']) ->select();// 获取今天的数据 $result = Db::name('data') ->whereTime('create_time', 'today') ->select();// 获取昨天的数据 $result = Db::name('data') ->whereTime('create_time', 'yesterday') ->select();// 获取本周的数据 $result = Db::name('data') ->whereTime('create_time', 'week') ->select(); // 获取上周的数据 $result = Db::name('data') ->whereTime('create_time', 'last week') ->select();
11、分块查询
//使用分块查询,可以把1万条记录分成100次处理,每次处理100条记录,代码示例如下: Db::name('data') ->where('status', '>', 0) ->chunk(100, function ($list) { // 处理100条记录 foreach($list as $data){ } }); //第二个参数可以是有效的callback类型,包括使用闭包函数。 //系统会按照主键顺序查询,每次查询100条,如果你不希望使用主键进行查询,或者没有主键的话,则需要指定查询的排序字段(但必须是唯一的),例如: Db::name('user') ->where('status', '>', 0) ->chunk(100, function ($list) { // 处理100条记录 foreach($list as $data){ } }, 'uid'); //然后交给callback进行数据处理,处理完毕后继续查询下一个100条记录,如果你需要在中途中断后续的查询,只需要在callback方法调用中返回false即可,例如: Db::name('data') ->where('status','>',0) ->chunk(100,function($list){ foreach($list as $data){ // 返回false则中断后续查询 return false; } });