基本使用
可以直接使用数据库运行原生SQL操作了,支持 query (查询操作)和 execute (写入操作)方法,并且支持参数绑定。
Db::query(\'select * from think_user where id=?\',[8]);
Db::execute(\'insert into think_user (id, name) values (?, ?)\',[8,\'thinkphp\']);
也支持命名占位符绑定,例如:
Db::query(\'select * from think_user where id=:id\',[\'id\'=>8]); Db::execute(\'insert into think_user (id, name) values (:id, :name)\',[\'id\'=>8,\'name\'=>\'thinkphp\']);
可以使用多个数据库连接,使用
Db::connect($config)->query(\'select * from think_user where id=:id\',[\'id\'=>8]);
config是一个单独的数据库配置,支持数组和字符串,也可以是一个数据库连接的配置参数名。
查询数据
基本查询
查询一个数据使用:
// table方法必须指定完整的数据表名 Db::table(\'think_user\')->where(\'id\',1)->find();
find 方法查询结果不存在,返回 null
查询数据集使用:
Db::table(\'think_user\')->where(\'status\',1)->select();
select 方法查询结果不存在,返回空数组
如果设置了数据表前缀参数的话,可以使用
Db::name(\'user\')->where(\'id\',1)->find();
Db::name(\'user\')->where(\'status\',1)->select();
如果你的数据表没有使用表前缀功能,那么name和table方法的一样的效果。
在 find 和 select 方法之前可以使用所有的链式操作方法。
默认情况下,find和select方法返回的都是数组。
助手函数
系统提供了一个 db 助手函数,可以更方便的查询:
db(\'user\')->where(\'id\',1)->find();
db(\'user\')->where(\'status\',1)->select();
注意:使用db助手函数默认每次都会重新连接数据库,而使用 Db::name 或者 Db::table 方法的话都 是单例的。db函数如果需要采用相同的链接,可以传入第三个参数,例如:
db(\'user\',[],false)->where(\'id\',1)->find(); db(\'user\',[],false)->where(\'status\',1)->select();
上面的方式会使用同一个数据库连接,第二个参数为数据库的连接参数,留空表示采用数据库配置文件的 配置。
使用Query对象或闭包查询
或者使用查询对象进行查询,例如:
$query = new \think\db\Query(); $query->table(\'think_user\')->where(\'status\',1); Db::find($query); Db::select($query);
或者直接使用闭包函数查询,例如:
Db::select(function($query){ $query->table(\'think_user\')->where(\'status\',1); });
值和列查询
查询某个字段的值可以用
// 返回某个字段的值 Db::table(\'think_user\')->where(\'id\',1)->value(\'name\');
value 方法查询结果不存在,返回 null
查询某一列的值可以用
// 返回数组 Db::table(\'think_user\')->where(\'status\',1)->column(\'name\'); // 指定索引 Db::table(\'think_user\')->where(\'status\',1)->column(\'name\',\'id\');
column 方法查询结果不存在,返回空数组
数据集分批处理
如果你需要处理成千上百条数据库记录,可以考虑使用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) { // 处理结果集... return false; });
也支持在chunk方法之前调用其它的查询方法,例如:
Db::table(\'think_user\')->where(\'score\',\'>\',80)->chunk(100,function($users) { foreach ($users as $user) { // } });
JSON类型数据查询(mysql V5.0.1 )
// 查询JSON类型字段 (info字段为json类型) Db::table(\'think_user\')->where(\'info$.email\',\'thinkphp@qq.com\')->find();
添加数据
添加一条数据
使用 Db 类的 insert 方法向数据库提交数据
$data = [\'foo\' => \'bar\', \'bar\' => \'foo\']; Db::table(\'think_user\')->insert($data);
如果你在 database.php 配置文件中配置了数据库前缀( prefix ),那么可以直接使用 Db 类的 name 方法提交数据
Db::name(\'user\')->insert($data);
insert 方法添加数据成功返回添加成功的条数,insert 正常情况返回 1
添加数据后如果需要返回新增数据的自增主键,可以使用 getLastInsID 方法:
Db::name(\'user\')->insert($data); $userId = Db::name(\'user\')->getLastInsID();
或者直接使用 insertGetId 方法新增数据并返回主键值:
Db::name(\'user\')->insertGetId($data);
insertGetId 方法添加数据成功返回添加数据的自增主键
添加多条数据
添加多条数据直接向 Db 类的 insertAll 方法传入需要添加的数据即可
$data = [ [\'foo\' => \'bar\', \'bar\' => \'foo\'], [\'foo\' => \'bar1\', \'bar\' => \'foo1\'], [\'foo\' => \'bar2\', \'bar\' => \'foo2\'] ]; Db::name(\'user\')->insertAll($data);
insertAll 方法添加数据成功返回添加成功的条数
助手函数
// 添加单条数据 db(\'user\')->insert($data); // 添加多条数据 db(\'user\')->insertAll($list);
快捷更新
V5.0.5+ 以上版本封装的快捷更新方法 data ,可以配合 insert 使用。
下面举个例子说明用法:
Db::table(\'data\') ->data([\'name\'=>\'tp\',\'score\'=>1000]) ->insert();
更新数据
更新数据表中的数据
Db::table(\'think_user\') ->where(\'id\', 1) ->update([\'name\' => \'thinkphp\']);
如果数据中包含主键,可以直接使用:
Db::table(\'think_user\')
->update([\'name\' => \'thinkphp\',\'id\'=>1]);
update 方法返回影响数据的条数,没修改任何数据返回 0
如果要更新的数据需要使用 SQL 函数或者其它字段,可以使用下面的方式:
Db::table(\'think_user\') ->where(\'id\', 1) ->update([ \'login_time\' => [\'exp\',\'now()\'], \'login_times\' => [\'exp\',\'login_times+1\'], ]);
更新某个字段的值
Db::table(\'think_user\') ->where(\'id\',1) ->setField(\'name\', \'thinkphp\');
setField 方法返回影响数据的条数,没修改任何数据字段返回 0
自增或自减一个字段的值
setInc/setDec 如不加第二个参数,默认值为1
// 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);
延迟更新
setInc/setDec 支持延时更新,如果需要延时更新则传入第三个参数
下例中延时10秒,给 score 字段增加1
Db::table(\'think_user\')->where(\'id\', 1)->setInc(\'score\', 1, 10);
setInc/setDec 方法返回影响数据的条数
助手函数
// 更新数据表中的数据 db(\'user\')->where(\'id\',1)->update([\'name\' => \'thinkphp\']); // 更新某个字段的值 db(\'user\')->where(\'id\',1)->setField(\'name\',\'thinkphp\'); // 自增 score 字段 db(\'user\')->where(\'id\', 1)->setInc(\'score\'); // 自减 score 字段 db(\'user\')->where(\'id\', 1)->setDec(\'score\');
快捷更新( V5.0.5+ )
V5.0.5+ 以上版本封装的 data 、 inc 、 dec 和 exp 方法属于链式操作方法,可以配合 update 使 用。
下面举个例子说明用法:
Db::table(\'data\') ->where(\'id\',1) ->inc(\'read\') ->dec(\'score\',3) ->exp(\'name\',\'UPPER(name)\') ->update();
删除数据
删除数据表中的数据
// 根据主键删除 Db::table(\'think_user\')->delete(1); Db::table(\'think_user\')->delete([1,2,3]); // 条件删除 Db::table(\'think_user\')->where(\'id\',1)->delete(); Db::table(\'think_user\')->where(\'id\',\'<\',10)->delete();
delete 方法返回影响数据的条数,没有删除返回 0
助手函数
// 根据主键删除 db(\'user\')->delete(1); // 条件删除 db(\'user\')->where(\'id\',1)->delete();