• 技术文章 >php框架 >ThinkPHP

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

    藏色散人藏色散人2021-02-03 18:48:56转载538
    下面由thinkphp教程栏目给大家介绍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数据库操作之视图查询、子查询、原生查询的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:cnblogs,如有侵犯,请联系admin@php.cn删除
    专题推荐:ThinkPHP
    上一篇:ThinkPHP数据库操作之查询事件、事务操作、监听SQL 下一篇:查看thinkphp当前版本号的三种方法
    大前端线上培训班

    相关文章推荐

    • ThinkPHP 数据库操作之增删改查• ThinkPHP数据库操作之查询方法、查询语法、链式操作• ThinkPHP数据库操作之聚合查询、时间查询、高级查询• ThinkPHP数据库操作之存储过程、数据集、分布式数据库• ThinkPHP数据库操作之查询事件、事务操作、监听SQL

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网