zoukankan      html  css  js  c++  java
  • ThinkPHP---TP功能类之联表查询

    【一】介绍

    在原生的sql中使用join 语法进行数据的联表查询,

    在ThinkPHP里支持联表查询操作,但是可以归纳成两种方式:table方法、join方法

    (1)table方法:在TP中对应SQL原型

    原生PHP方法:通过where语法进行表1和表2的关联操作,即让两个表关联

    select  表1.字段,表2.字段 [as 关联查询出的字段名] from  表1[as 别名1],表2[as 别名2]  where  表1.字段=表2.字段

    ThinkPHP封装的方法:

    $model->table();  //table方法是连贯操作中的一个辅助方法

    (2)案例:查询每个职员的全部信息

    分析:因为职员信息里,有一个dept_id字段,是部门表中的主键。所以此处应该读取出部门的名称。所以要求关联部门表,关联条件为职员表里的dept_id=部门表里的id

    数据表:职员表sp_user、部门表sp_dept

    主表和从表的确定:主表sp_user(别名t1)、从表sp_dept(别名t2)

    语法:

    select t1.*,t2.name as deptname from sp_user as t1,sp_dept as t2 where t1.dept_id=t2.id;

    在Navicate中执行结果

    将上述代码在TP中实现查询效果

    ①方法一:通过原生sql语句执行

    //原生SQL方法实现联表查询
                public function test(){
                    //实例化模型
                    $model = M();//执行原生sql语句可以不用关联表,因为sql里进行了关联
                    //定义sql语句
                    $sql="select t1.*,t2.name as deptname from sp_user as t1,sp_dept as t2 where t1.dept_id=t2.id;";
                    $result = $model -> query($sql);
                    dump($result);die;
                }

    这里输出联表查询结果,会输出

    array(8) {
      [0] => array(14) {
        ["id"] => string(1) "1"
        ["username"] => string(5) "admin"
        ["password"] => string(6) "123456"
        ["nickname"] => string(5) "admin"
        ["truename"] => string(9) "管理员"
        ["dept_id"] => string(1) "1"
        ["sex"] => string(3) "男"
        ["birthday"] => string(10) "2017-01-06"
        ["tel"] => string(5) "10000"
        ["email"] => string(9) "56@qq.com"
        ["remark"] => string(9) "石家庄"
        ["addtime"] => string(8) "12345678"
        ["role_id"] => string(1) "1"
        ["deptname"] => string(9) "人力部"
      }
    ......
    }

    仔细观察,不难发现user表里面多了一个deptname的属性,说明职员表的dept_id为1时,对应部门表的id为1的人力部

    ②方法二:使用table方法实现

    注意:在ThinkPHP里一般不建议使用原生SQL语句方法执行SQL

    table语法:

    $model->table('表名1[as 别名1],表名2[as 别名2]......');  //table方法是连贯操作中的一个辅助方法

     在使用table方法之后模型会自动关联上table方法中指定的数据表,下面使用table方法改写之前原生SQL:

    //table方法实现联表查询
                public function test(){
                    //实例化模型
                    $model = M();//直接实例化父类即可,不需要关联数据表!!!
                    // 连贯操作,这里我为了好看(♥∀♥),将代码分行,分不分行都可以
                    $result = $model->field('t1.*,t2.name as deptname')
    ->table('sp_user as t1,sp_dept as t2')
    ->where('t1.dept_id = t2.id')
    ->select(); dump($result);die; }

    (2)join方法

    JOIN方法也是连贯操作方法之一,用于根据两个或多个表中的列之间的关系,从这些表中查询数据。

    join通常有下面几种类型,不同类型的join操作会影响返回的数据结果。

    • INNER JOIN: 等同于 JOIN(默认的JOIN类型),如果表中有至少一个匹配,则返回行
    • LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
    • RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
    • FULL JOIN: 只要其中一个表中存在匹配,就返回行

    常用类型:

                   INNER JOIN:内联;

                   LEFT JOIN(左外左主)和RIGHT JOIN(右外右主):外联;

    在原生的SQL里join语法:

    select 表1.字段,表2.字段 from 表1[as 别名1] [inner/left/right/full]join 表2[as 别名2] on 表1.字段=表2.字段; 

    案例:查询部门详细信息,列出每一条部门信息中pid对应的部门名称。

    分析:主表sp_dept(别名t1),从表sp_dept(别名t2)

    条件:t1.pid = t2.id

    ①原生SQL方法:

    select t1.*,t2.name as deptname from sp_dept as t1 left join sp_dept as t2 on t1.pid=t2.id;

    Navicat执行结果:这里会显示上级部门,人力部为顶级部门pid为0,技术部归财务部管所以pid为2,财务部和外交部归人力部管所以pid为1

    ②ThinkPHP中执行join语法:

           通过on进行关联,join方法也是连贯操作的辅助方法之一,且只有一个参数

    $model->join('联表方式 join 表名[as 表名1] on 表1.字段=表2.字段');

    如果需要给当前模型关联的表起别名,可以使用alias方法:

    $model->alias('别名');//辅助方法之一
    //jion方法实现联表查询
                public function test(){
                    //实例化模型
                    $model = M('dept');//直接实例化父类即可,不需要关联数据表!!!
                    // select t1.*,t2.name as deptname from sp_dept as t1 left join sp_dept as t2 on t1.pid=t2.id;
                    $result = $model->field('t1.*,t2.name as deptname')->alias('t1')->join('left join sp_dept as t2 on t1.pid=t2.id')->select();
                    dump($result);
                }

    跟踪信息SQL语句:SELECT t1.*,t2.name as deptname FROM sp_dept t1 left join sp_dept as t2 on t1.pid=t2.id [ RunTime:0.0010s ]

    浏览器输出:

    array(4) {
      [0] => array(6) {
        ["id"] => string(1) "2"
        ["name"] => string(9) "财务部"
        ["pid"] => string(1) "1"
        ["sort"] => string(2) "50"
        ["remark"] => string(18) "财务资源部门"
        ["deptname"] => string(9) "人力部"
      }
    ......
    }

    注意:开发里会遇到一种关联情况,自己关联自己---自联查询

    应用:一级导航和二级导航;省市县三级联动表;

  • 相关阅读:
    Winform中实现ZedGraph曲线图缩放后复原功能
    MySQL Workbench 安装失败 Mysql workbench requires the visual C++ 2019 redistributable package
    MySQL Workbench 8.0提示SSL connection error: SSL is required but the server doesn‘t support it
    域名证书有效,但是访问提示不安全连接
    图片Base64编码
    centos系统设置防火墙
    《中有成就秘笈》之中央密严刹土
    Arweave
    去中心化身份聚合器
    区块链跨链技术
  • 原文地址:https://www.cnblogs.com/fightjianxian/p/8687065.html
Copyright © 2011-2022 走看看