ThinkPHP5数据库实例详解

浏览21089
更新时间2022-01-20

fetchSql方法

1、功能:获取执行的SQL语句字符串

2、源码位置:/thinkphp/library/think/db/Query.php

3、参数和返回值:

1.该方法仅是给Query类的查询选择属性options['fetch_sql']赋值;
 2.参数为布尔类型,确定是否输出当前SQL语句;
 3.返回当前对象,可以继续调用后面的连贯方法。

序号 参数 说明
1 true / 真 返回当前SQL语句字符串,后面SQL生成方法失效
2 false / 假 不返回当前SQL语句字符串,后面的SQL生成方法正常执行,如select

4、方法使用环境

  • 适合于仅生成SQL语句,不返回查询结果集;
  • 用来拼接复杂查询语句,或者SQL语句做为子查询时。

5、调用语法(常用格式)

  • 仅返回SQL语句字符串,适合仅需要SQL语句,不需要查询结果
Db::table(表名) -> field(字段名) -> where(条件) ->fetchSql(true) -> select();
  • 忽略fetchSql方法,继续生成SQL查询并返回结果集
Db::table(表名) -> field(字段名) -> where(条件) ->fetchSql(false) -> select();

6、实例演示

为了演示出实战效果,我们将原来的数据表tp5_staff做些改进
 1、原表中,部门是直接使用了部门名称,例如:'开发部',这是不符合规范的,正确有做法是再新建一张部门表(tp5_dept),将部门信息(部门id,部门名称dept_name)单独存放。
 2、这样,在tp_staff表中,部门dept字段只存放部门id号即可;

准备工作:

  1. 创建tp5_dept 表,并插入部门信息;
  • 创建tp5_dept表
# 创建 tp5_dept 数据表
CREATE TABLE IF NOT EXISTS tp5_dept(
id TINYINT(2) UNSIGNED NOT NULL AUTO_INCREMENT,
dept_name VARCHAR(20) NOT NULL  DEFAULT '开发部' COMMENT '部门名称',
PRIMARY KEY (id)
)ENGINE =  MyISAM DEFAULT CHARSET = UTF8;
  • 给tp5_dept 数据表插入数据
#给tp5_dept 数据表插入数据
INSERT tp5_dept (dept_name) VALUES ('开发部'),('市场部'),('客服部');
  • 查看部门信息表:tp5_dept
SELECT * FROM `tp5_dept` ;

  1. 将tp_staff表中部门名称,由中文名称换成与tp5_dept表对应的数字,然后再修改dept字段的类型,使之与tp5_dept部门表中的id字段一致。
  • 记住tp5_staff 中dept字段名称与tp5_dept中id 与 dept_name之间的对应关系;
  • 修改tp_staff表中的dept字段的类型和约束条件,使之与tp5_dept表中的id字段一致;
ALTER TABLE `tp5_staff` CHANGE dept dept TINYINT(2) UNSIGNED NOT NULL ;
  • 将tp5_staff中文部门名称修改为数字,并与新建的部门表一一对应

任务:查询开发部员工的基本信息(id,name,salary)

分析:
 1、因为在tp5_staff员工信息表中,只存有部门id。详细的部门信息存放在tp5_dept部门信息表中,就是涉到二张表联合查询;
 2、这个任何,如果用多表查询,是很容易解决的;
 3、现在我们仅仅用我们学过的知识来完成。

  • 我们仍将代码放在:application/index/controller/Index.php的index()方法中
  • 最终要形成的SQL语句如下:
SELECT id,name FROM tp5_staff WHERE dept IN (SELECT id FROM tp5_dept  WHERE dept_name   LIKE '%开发部%' )

1.先成子查询,获取到与开发部对应的部门id;
 2.生成父查询,先获取到全部员工信息;
 3.将上面的子查询做为条件传入,获取到开发部员工信息。

<?php
namespace app\index\controller;
use think\Db;
class Index {
    public function index(){ 

        // 1.获取'开发部'的部门id
        $subSql = Db::table(['tp5_dept'=>'dept'])  //指定tp5_dept表
        ->field('id')    //设置返回字段
        ->where(['dept_name'=>['like','%开发部%']])  //设置查询条件
        ->fetchSql(true)    //仅返回SQL查询语句,不做真实查询
        ->select();    //  生成SQL语句字符串

        echo '1.获取[开发部]的部门id的子查询语句:<br />';
        echo  $subSql.'<br/>';

        // 2.获取tp5_staff员工信息表全部信息的SQL语句
        $parSql = Db::table('tp5_staff')->field('id,name') //设置查询条件
        ->fetchSql(true)->select();   //返回SQL语句字符串,不做查询 

        echo '2.获取tp5_staff员工信息表全部信息的SQL语句:<br />';
        echo $parSql.'<br />';

        //3.将子查询SQL语句做为查询条件IN的集合值,与父查询进行拼接,形成SELECT查询SQL
        $sql = $parSql . 'WHERE dept IN (' .$subSql.')';

        echo '3.将子查询SQL语句做为查询条件IN的集合值,与父查询进行拼接,形成SELECT查询SQL:<br />';
        echo $sql;

        //4.用我们刚学习过的原生Query,执行查询操作
        dump(Db::query($sql));     
 } 
}
  • 查询结果:
1.获取[开发部]的部门id的子查询语句:
SELECT `id` FROM `tp5_dept` `dept` WHERE `dept_name` LIKE '%开发部%'

2.获取tp5_staff员工信息表全部信息的SQL语句:
SELECT `id`,`name` FROM `tp5_staff`

3.将子查询SQL语句做为查询条件IN的集合值,与父查询进行拼接,形成最终查询SQL:
SELECT `id`,`name` FROM `tp5_staff` WHERE dept IN (SELECT `id` FROM `tp5_dept` `dept` WHERE `dept_name` LIKE '%开发部%' )

----------------------------------------------------------------------------------------------
下面是最终的查询结果:

array(3) {
  [0] => array(2) {
    ["id"] => int(1001)
    ["name"] => string(6) "郭靖"
  }
  [1] => array(2) {
    ["id"] => int(1002)
    ["name"] => string(9) "洪七公"
  }
  [2] => array(2) {
    ["id"] => int(1011)
    ["name"] => string(9) "李云龙"
  }
}

7、注意事项:

实际开发中,更多的用在调试SQL语句,用户对查询结果感兴趣,对SQL语句不感兴趣

8、课后作业:

将本课实例上机动手做一遍

相关视频

更多

免费

php8,我来也
初级php8,我来也

34万次学习

收藏

免费

Thinkphp6.0正式版视频教程
中级Thinkphp6.0正式版视频教程

39.6万次学习

收藏

免费

细说PHP第一季
中级细说PHP第一季

31万次学习

收藏

精品课程

更多
前端入门_HTML5
前端入门_HTML5

共29课时

65万人学习

CSS视频教程-玉女心经版
CSS视频教程-玉女心经版

共25课时

41.3万人学习

JavaScript极速入门_玉女心经系列
JavaScript极速入门_玉女心经系列

共43课时

76.7万人学习

独孤九贱(1)_HTML5视频教程
独孤九贱(1)_HTML5视频教程

共25课时

64.1万人学习

独孤九贱(2)_CSS视频教程
独孤九贱(2)_CSS视频教程

共22课时

24.4万人学习

独孤九贱(3)_JavaScript视频教程
独孤九贱(3)_JavaScript视频教程

共28课时

36.2万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时

133.2万人学习

热门下载

更多
phpStudy 2018最新版
phpStudy 2018最新版

集成PHP7,16种组合,超全大合集

下载

VC9 32位
VC9 32位

VC9 32位 phpstudy集成安装环境运行库

下载

VC11 32位
VC11 32位

VC11 32位 phpstudy集成安装环境运行库​

下载

php程序员工具箱完整版
php程序员工具箱完整版

程序员工具箱 v1.0 php集成环境

下载

VC14 32位
VC14 32位

VC14 32位 phpstudy安装环境运行库

下载

SublimeText3汉化版
SublimeText3汉化版

中文版,非常好用

下载

Notepad++ Windows版
Notepad++ Windows版

Notepad++ 8.9.7 Windows版官方安装包,适合 Windows 用户进行代码编辑、文本处理、语法高亮和插件扩展配置。

下载