ThinkPHP数据库操作之视图查询、子查询、原生查询的示例

这篇“ThinkPHP数据库操作之视图查询、子查询、原生查询的示例”除了程序员外大部分人都不太理解,今天小编为了让大家更加理解“ThinkPHP数据库操作之视图查询、子查询、原生查询的示例”,给大家总结了以下内容,具有一定借鉴价值,内容详细步骤清晰,细节处理妥当,希望大家通过这篇文章有所收获,下面让我们一起来看看具体内容吧。

为长沙等地区用户提供了全套网页设计制作服务,及长沙网站建设行业解决方案。主营业务为成都做网站、成都网站设计、长沙网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

thinkphp是什么

thinkphp属于一种免费的开发框架,能够用于开发前端网页,最早thinkphp是为了简化开发而产生的,thinkphp同时也是遵循Apache2协议,最初是从Struts演变过来,也把国外一些好的框架模式进行利用,使用面向对象的开发结构,兼容了很多标签库等模式,它能够更方便和快捷的开发和部署应用,当然不仅仅是企业级应用,任何php应用开发都可以从thinkphp的简单、兼容和快速的特性中受益。

视图查询

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

Db::view('User','id,name')
    ->view('Profile','truename,phone,email','Profile.user_id=User.id')
    ->view('Score','score','Score.user_id=Profile.id')
    ->where('score','>',80)
    ->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

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

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

Db::view('User','id,name')
    ->view('Profile','truename,phone,email','Profile.user_id=User.id','LEFT')
    ->view('Score','score','Score.user_id=Profile.id','RIGHT')
    ->where('score','>',80)
    ->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

可以使用别名:

Db::view('User',['id'=>'uid','name'=>'account'])
    ->view('Profile','truename,phone,email','Profile.user_id=User.id')
    ->view('Score','score','Score.user_id=Profile.id')
    ->where('score','>',80)
    ->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

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

Db::view(['think_user'=>'member'],['id'=>'uid','name'=>'account'])
    ->view('Profile','truename,phone,email','Profile.user_id=member.id')
    ->view('Score','score','Score.user_id=Profile.id')
    ->where('score','>',80)
    ->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 think_profile Profile ON Profile.user_id=member.id 
INNER JOIN think_socre Score ON Score.user_id=Profile.id 
WHERE Score.score > 80

子查询

首先构造子查询SQL,可以使用下面三种的方式来构建子查询。

1、使用 select 方法

当select方法的参数为false的时候,表示不进行查询只是返回构建SQL,例如:

$subQuery = Db::table('think_user')    
->field('id,name')    
->where('id','>',10)    
->select(false);

生成的subQuery结果为:

SELECT `id`,`name` FROM `think_user` WHERE `id` > 10

2、使用 fetchSql 方法

fetchSql方法表示不进行查询而只是返回构建的SQL语句,并且不仅仅支持select,而是支持所有的CURD查询。

$subQuery = Db::table('think_user')    
->field('id,name')    
->where('id','>',10)    
->fetchSql(true)    
->select();

生成的subQuery结果为:

SELECT `id`,`name` FROM `think_user` WHERE `id` > 10

3、使用 buildSql 构造子查询

$subQuery = Db::table('think_user')    
->field('id,name')    
->where('id','>',10)    
->buildSql();

生成的subQuery结果为:

( SELECT `id`,`name` FROM `think_user` WHERE `id` > 10 )

调用buildSql方法后不会进行实际的查询操作,而只是生成该次查询的SQL语句(为了避免混淆,会在SQL两边加上括号),然后我们直接在后续的查询中直接调用。

需要注意的是,使用前两种方法需要自行添加‘括号’。

然后使用子查询构造新的查询:

Db::table($subQuery.' a')    
->where('a.name','like','thinkphp')    
->order('id','desc')    
->select();

生成的SQL语句为:

SELECT * FROM ( SELECT `id`,`name` FROM `think_user` WHERE `id` > 10 ) a WHERE a.name LIKE 'thinkphp' ORDER BY `id` desc

4、使用闭包构造子查询

IN/NOT IN 和 EXISTS/NOT EXISTS 之类的查询可以直接使用闭包作为子查询,例如:

Db::table('think_user')    
->where('id','IN',function($query){        
$query->table('think_profile')->where('status',1)->field('id');
    })    
    ->select();

生成的SQL语句是

SELECT * FROM `think_user` WHERE `id` IN ( SELECT `id` FROM `think_profile` WHERE `status` = 1 )
Db::table('think_user')    
->where(function($query){        
$query->table('think_profile')->where('status',1);
    },'exists')    
    ->find();

生成的SQL语句为

SELECT * FROM `think_user` WHERE EXISTS ( SELECT * FROM `think_profile` WHERE `status`= 1 )

原生查询

Db 类支持原生 SQL 查询操作,主要包括下面两个方法:

query 方法

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

使用示例:

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

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

execute 方法

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

使用示例:

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

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

参数绑定

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

Db::query("select * from think_user where id=? AND status=?",[8,1]);
// 命名绑定
Db::execute("update think_user set name=:name where status=:status",['name'=>'thinkphp','status'=>1]);

感谢你的阅读,希望你对“ThinkPHP数据库操作之视图查询、子查询、原生查询的示例”这一关键问题有了一定的理解,具体使用情况还需要大家自己动手实验使用过才能领会,快去试试吧,如果想阅读更多相关知识点的文章,欢迎关注创新互联行业资讯频道!


网页名称:ThinkPHP数据库操作之视图查询、子查询、原生查询的示例
当前链接:http://myzitong.com/article/ggigds.html