介绍
在原生的sql中使用join 语法进行数据的联表查询,在ThinkPHP里支持联表查询操作,但是可以归纳成两种方式:table方法、join方法。
首先是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方法是连贯操作中的一个辅助方法
案例:查询每个职员的全部信息
分析:因为职员信息里,有一个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; }
②方法二:使用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; }
oin方法
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('别名');//辅助方法之一