欢迎加入laravel技术交流群 :784030154
数据库操作由低到高分为三个层次
1、原生的sql操作
2、链式操作
3、模型的对象化查询
数据库配置配置在application/database.php文件中,如果多模块中的数据库配置不同,那么可以在模块文件夹下,单独配置 application/模块/database.php,只要将其中不同的部分配置即可,相同部分无需重复配置
1.原生的sql操作
1.1、写操作
Db::execute('insert into think_data(id,name,status) values(5,"thinkphp",1)');
Db::execute('update from think_data set name = "framework" where id = 5');
Db::execute(' delete from think_data where id=5');
1.2、读操作
Db::query('select * from think_data where id = 5');
1.3、
query方法返回的结果是一个数据集,如果没有数据则返回空数组
execute方法返回的结果是影响的行数
1.4、在实际开发中,为操作更加安全,可以使用参数绑定的方式
Db::execute('insert into think_data (id, name ,status) values (?, ?, ?)', [8, 'thinkphp', 1]);
$result = Db::query('select * from think_data where id = ?', [8]);
2、链式操作
Db::table('think_data')->insert(['id'=>18,'name'=>'thinkphp','status'=>1]);
Db::table('think_data')->where('id',8)->update(['name'=>'hello']);
Db::table('think_data')->where('id',8)->select();
Db::table('think_data')->where('id',18)->delete();
如果在配置文件配置了表前缀,可以使用name替代table
Db::name('data')->insert(['id'=>18,'name'=>'thinkphp','status'=>1]);
Db::name('data')->where('id',8)->update(['name'=>'hello']);
Db::name('data')->where('id',8)->select();
Db::name('data')->where('id',18)->delete();
也可以使用助手函数db进一步简化操作,db()默认重新连接数据库
$db = db('data')
$db->insert(['id'=>20,'name'=>'thinkphp'])
$db->where('id',20)->update(['name'=>'framework']);
$db->where('id',20)->select();
$db->where('id',20)->delete();
链式操作,可以完成复杂的数据库操作,在find,select,delete,update,insert方法之前链式操作不分先后。
$list = Db::name('data')
->where('status', 1)
->field('id,name')
->order('id', 'desc')
->limit(10)
->select();
其中value单独一个值,column查询列,chunk分批次查询,count行数,sum总数
3.事务控制:最简单的调用transacrtion方法
Db::transacrtion(function(){
Db::table('think_user')->delete(1);
Db::table('think_data')->insert(['id'=>28,'name'=>'thinkphp','status'=>1]);
});
也可以手动进行事务操作
Db::startTrans();
try{
Db::table('think_user')->delete(1);
Db::table('think_data')->insert(['id'=>28,'name'=>'thinkphp','status'=>1]);
Db::commit();
}catch(\Exception $e){
Db::rollback();
}
4.查询语句
4.1查询表达式
$result = Db::name('data')
->where('id','=', 1)
->find();
find方法用于查找满足条件的第一个记录,查询成功返回一维数组,没有满足则默认返回null
select方法用于查找满足条件的所有记录,查询成功返回二位数组,没有满足则默认返回null
使用表达式时,where的方法的参数依次为:where( 字段名,条件表达式,查询值 )
其中条件表达式包括EQ,NEQ,GT,EGT,LT,ELT,LIKE,BETWEEN,IN,NULL,EXISTS,EXP,不区分大小写,查询值为单个值,可以为字符串,也可以数字;当查询值为两个或两个以上值时,可以以‘,’为分隔符的字符串,或者数组的形式;
当表达式为exp时
$result = Db::name('data')
->where('id','exp','>=1')
->limit(10)
->select(); //SELECT * FROM `think_data` WHERE `id` >= 1 LIMIT 10
Db::name('data')
->where('id','in',[1,2,3])
->select(); //SELECT * FROM `think_data` WHERE `id` IN (1,2,3)
Db::name('data')
->where('id','between',[5,8])
->select(); //SELECT * FROM `think_data` WHERE `id` between 5 and 8;
Db::name('data')
->where('name','null')
->select(); //SELECT * FROM `think_data` WHERE `name` IS NULL
Db::name('data')
->where('id','between',[1,3])
->where('name','like','%think%')
->select()//SELECT * FROM `think_data` WHERE `id` BETWEEN 1 AND 3 AND `name` LIKE '%think%'
4.2批量查询
使用一个方法完成多个查询条件
可将上面的查询可以改成
Db::name('data')
->where([
'id'=>['between','1,3'],
'name'=>['like','%think%']
])->select(); //SELECT * FROM `think_data` WHERE `id` BETWEEN 1 AND 3 AND `name` LIKE '%think%'
Db::name('data')
->where('id',['in',[1,2,3]],['between','5,8'],'or')
->limit(10)
->Select();
4.3快捷查询
Db::name('data')
->where('id&status','>',0)
->limit(10)
->select(); //SELECT * FROM `think_data` WHERE ( `id` > 0 AND `status` > 0 ) LIMIT 10
Db::name('data')
->where('id|status','>',0)
->limit(10)
->select(); //SELECT * FROM `think_data` WHERE ( `id` > 0 OR `status` > 0 ) LIMIT 10
4.4视图查询
Db::view('user','id,name,status')
->view('profile',['name'=>'truename','phone','email'],'profile.user_id=user.id')
->where('status',1)
->order('id desc')
->select(); // SELECT user.id,user.name,user.status,profile.name AS truename,profile.phone,profile.ema
il FROM think_user user INNER JOIN think_profile profile ON profile.user_id=user.id WHE
RE user.status = 1 order by user.id desc
4.5闭包查询
find和select可以直接使用闭包查询
$result = Db::name('data')
->select(function($query){
$query->where('name','like','%tinkphp%')->where('id','in','1,2,3')->limit(10)
})
4.6获取具体的值,可以使用value方法
Db::name('data')
->where('id',8)
->value('name') //select name from think_data where id=8 limit 1;
4.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'
如果希望返回以id为索引的name列的数据,可以改成
Db::name('data')
->where('status',1)
->column('name','id');
返回的数据如下:
array (size=5)
1 => string 'thinkphp'
2 => string 'onethink'
3 => string 'topthink'
4 => string 'kancloud'
4.8聚合查询
count() 统计数量 统计的字段名可选
max() 统计最大值 统计的字段名必填
min() 统计最小值 统计的字段名必填
avg() 统计平均值 统计的字段名必填
sum() 获取总分 统计的字段名必填
4.9字符串查询
在必要时候,也可以使用原生的字符串查询,但为了避免注入的问题,可以配合参数绑定一起使用。
$result = Db::name('data')
->where('id > :id AND name IS NOT NULL', ['id' => 10])
->select();
dump($result);
4.10时间查询
$result = Db::name('data')
->whereTime('create_time','>','2016-1-4')->select
$result = Db::name('data')
->whereTime('create_time','>','this week')->select();
Db::name('data')
->whereTime('create_time','today')
->select();
Db::name('data')
->whereTime('create_time','yesterday')
->select();
Db::name('data')
->whereTime('create_time','week')
->select();
日期查询对create_time字段类型没有要求,可以是int/string/timestamp/datatime/date中任何一种
4.11分块查询
当查询数据比较大的时,我们就需要分块查询
使用分块查询,可以把1万条记录分成100次处理,每次处理100条记录,代码如下
Db::name('data')
->where('status','>',0)
->chunk(100,function($list){
foreach($list as $data){
}
})
第二个参数可以用是有效的callback类型,包含使用闭包函数
系统按照主键的顺序,每次查询100条,如果你不希望使用主键进行查询,或者没有主键的话,则需要指定查询的排序字段(但必须是唯一的)
Db::name('user')
->where('status','>',0)
->chunk(100,function($list){
foreach($list as $data){
}
},'uid')
如需在中途中断,在callback方法中return false,便可终止。