tp5高级全面(增删改查)

快捷查询

快捷查询方式是一种多字段相同查询条件的简化写法,可以进一步简化查询条件的写法,在多个字段之间用|分割表示OR查询,用&分割表示AND查询,可以实现下面的查询,例如:

 
  1. Db::table('think_user')

  2. ->where('name|title','like','thinkphp%')

  3. ->where('create_time&update_time','>',0)

  4. ->find();

生成的查询SQL是:

SELECT * FROM `think_user` WHERE ( `name` LIKE 'thinkphp%' OR `title` LIKE 'thinkphp%' ) AND ( `create_time` > 0 AND `update_time` > 0 ) LIMIT 1

快捷查询支持所有的查询表达式。

区间查询

区间查询是一种同一字段多个查询条件的简化写法,例如:

 
  1. Db::table('think_user')

  2. ->where('name',['like','thinkphp%'],['like','%thinkphp'])

  3. ->where('id',['>',0],['<>',10],'or')

  4. ->find();

生成的SQL语句为:

SELECT * FROM `think_user` WHERE ( `name` LIKE 'thinkphp%' AND `name` LIKE '%thinkphp' ) AND ( `id` > 0 OR `id` <> 10 ) LIMIT 1

区间查询的查询条件必须使用数组定义方式,支持所有的查询表达式。

下面的查询方式是错误的:

 
  1. Db::table('think_user')

  2. ->where('name',['like','thinkphp%'],['like','%thinkphp'])

  3. ->where('id',5,['<>',10],'or')

  4. ->find();

批量查询

可以进行多个条件的批量条件查询定义,例如:

 
  1. Db::table('think_user')

  2. ->where([

  3. 'name' => ['like','thinkphp%'],

  4. 'title' => ['like','%thinkphp'],

  5. 'id' => ['>',0],

  6. 'status'=> 1

  7. ])

  8. ->select();

生成的SQL语句为:

SELECT * FROM `think_user` WHERE `name` LIKE 'thinkphp%' AND `title` LIKE '%thinkphp' AND `id` > 0 AND `status` = '1'

闭包查询

 
  1. Db::table('think_user')->select(function($query){

  2. $query->where('name','thinkphp')

  3. ->whereOr('id','>',10);

  4. });

生成的SQL语句为:

SELECT * FROM `think_user` WHERE `name` = 'thinkphp' OR `id` > 10

使用Query对象查询

也可以事先封装Query对象,并传入select方法,例如:

 
  1. $query = new \think\db\Query;

  2. $query->name('user')

  3. ->where('name','like','%think%')

  4. ->where('id','>',10)

  5. ->limit(10);

  6. Db::select($query);

如果使用Query对象的话,select方法之前调用的任何的链式操作都是无效。

混合查询

可以结合前面提到的所有方式进行混合查询,例如:

 
  1. Db::table('think_user')

  2. ->where('name',['like','thinkphp%'],['like','%thinkphp'])

  3. ->where(function($query){

  4. $query->where('id',['<',10],['>',100],'or');

  5. })

  6. ->select();

生成的SQL语句是:

SELECT * FROM `think_user` WHERE ( `name` LIKE 'thinkphp%' AND `name` LIKE '%thinkphp' ) AND ( `id` < 10 or `id` > 100 )

字符串条件查询

对于一些实在复杂的查询,也可以直接使用原生SQL语句进行查询,例如:

 
  1. Db::table('think_user')

  2. ->where('id > 0 AND name LIKE "thinkphp%"')

  3. ->select();

为了安全起见,我们可以对字符串查询条件使用参数绑定,例如:

 
  1. Db::table('think_user')

  2. ->where('id > :id AND name LIKE :name ',['id'=>0, 'name'=>'thinkphp%'])

  3. ->select();

V5.0.4+开始,ThinkPHP支持对同一个字段多次调用查询条件,例如:

 
  1. Db::table('think_user')

  2. ->where('name','like','%think%')

  3. ->where('name','like','%php%')

  4. ->where('id','in',[1,5,80,50])

  5. ->where('id','>',10)

  6. ->find();

 

视图查询可以实现不依赖数据库视图的多表查询,并不需要数据库支持视图,例如:

 
  1. Db::view('User','id,name')

  2. ->view('Profile','truename,phone,email','Profile.user_id=User.id')

  3. ->view('Score','score','Score.user_id=Profile.id')

  4. ->where('score','>',80)

  5. ->select();

生成的SQL语句类似于:

SELECT User.id,User.name,Profile.truename,Profile.phone,Profile.email,Score.score FROM think_user User INNER JOIN think_profile Profile ON Profile.user_id=User.id INNER JOIN think_socre Score ON Score.user_id=Profile.id WHERE Score.score > 80

注意,视图查询无需调用tablejoin方法,并且在调用whereorder方法的时候只需要使用字段名而不需要加表名。

默认使用INNER join查询,如果需要更改,可以使用:

 
  1. Db::view('User','id,name')

  2. ->view('Profile','truename,phone,email','Profile.user_id=User.id','LEFT')

  3. ->view('Score','score','Score.user_id=Profile.id','RIGHT')

  4. ->where('score','>',80)

  5. ->select();

生成的SQL语句类似于:

SELECT User.id,User.name,Profile.truename,Profile.phone,Profile.email,Score.score FROM think_user User LEFT JOIN think_profile Profile ON Profile.user_id=User.id RIGHT JOIN think_socre Score ON Score.user_id=Profile.id WHERE Score.score > 80

可以使用别名:

 
  1. Db::view('User',['id'=>'uid','name'=>'account'])

  2. ->view('Profile','truename,phone,email','Profile.user_id=User.id')

  3. ->view('Score','score','Score.user_id=Profile.id')

  4. ->where('score','>',80)

  5. ->select();

生成的SQL语句变成:

SELECT User.id AS uid,User.name AS account,Profile.truename,Profile.phone,Profile.email,Score.score FROM think_user User INNER JOIN think_profile Profile ON Profile.user_id=User.id INNER JOIN think_socre Score ON Score.user_id=Profile.id WHERE Score.score > 80

可以使用数组的方式定义表名以及别名,例如:

 
  1. Db::view(['think_user'=>'member'],['id'=>'uid','name'=>'account'])

  2. ->view('Profile','truename,phone,email','Profile.user_id=member.id')

  3. ->view('Score','score','Score.user_id=Profile.id')

  4. ->where('score','>',80)

  5. ->select();

生成的SQL语句变成:

SELECT member.id AS uid,member.name AS account,Profile.truename,Profile.phone,Profile.email,Score.score FROM think_user member INNER JOIN thi

query方法

query方法用于执行SQL查询操作,如果数据非法或者查询错误则返回false,否则返回查询结果数据集(同select方法)。

使用示例:

 
  1. Db::query("select * from think_user where status=1");

  2.  

如果你当前采用了分布式数据库,并且设置了读写分离的话,query方法始终是在读服务器执行,因此query方法对应的都是读操作,而不管你的SQL语句是什么。

execute方法

execute用于更新和写入数据的sql操作,如果数据非法或者查询错误则返回false ,否则返回影响的记录数。

使用示例:

 
  1. Db::execute("update think_user set name='thinkphp' where status=1");

  2.  

如果你当前采用了分布式数据库,并且设置了读写分离的话,execute方法始终是在写服务器执行,因此execute方法对应的都是写操作,而不管你的SQL语句是什么。

参数绑定

支持在原生查询的时候使用参数绑定,包括问号占位符或者命名占位符,例如:

 
  1. Db::query("select * from think_user where id=? AND status=?",[8,1]);

  2. // 命名绑定

  3. Db::execute("update think_user set name=:name where status=:status",['name'=>'thinkphp','status'=>1]);

 

使用事务处理的话,需要数据库引擎支持事务处理。比如 MySQL 的 MyISAM 不支持事务处理,需要使用 InnoDB 引擎。

使用 transaction 方法操作数据库事务,当发生异常会自动回滚,例如:

自动控制事务处理

 
  1. Db::transaction(function(){

  2. Db::table('think_user')->find(1);

  3. Db::table('think_user')->delete(1);

  4. });

也可以手动控制事务,例如:

 
  1. // 启动事务

  2. Db::startTrans();

  3. try{

  4. Db::table('think_user')->find(1);

  5. Db::table('think_user')->delete(1);

  6. // 提交事务

  7. Db::commit();

  8. } catch (\Exception $e) {

  9. // 回滚事务

  10. Db::rollback();

  11. }

注意在事务操作的时候,确保你的数据库连接是相同的。

--------------------- 本文来自 dream_living 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/qq_38738033/article/details/80312086?utm_source=copy

你可能感兴趣的:(tp5高级全面(增删改查))