tp5.0笔记3:数据库操作

欢迎加入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,便可终止。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    
 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值