ThinkPHP的功能类之联表查询

简介: ThinkPHP的功能类之联表查询

介绍

在原生的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('别名');//辅助方法之一
相关文章
|
8月前
|
人工智能 Rust 运维
这个神器让你白嫖ClaudeOpus 4.5,Gemini 3!还能接Claude Code等任意平台
加我进AI讨论学习群,公众号右下角“联系方式”文末有老金的 开源知识库地址·全免费
10867 22
|
Windows Linux
Windows CMD中的findstr命令详解
Windows CMD中的findstr命令详解 一、作用 findstr是Window系统自带的命令,用于查找某路径下指定的一个或多个文件中包含某些特定字符串的行,并将该行完整的信息打印出来,或者打印查询字符串所在的文件名。
8091 0
|
存储 机器学习/深度学习 缓存
软考软件评测师——计算机组成与体系结构(分级存储架构)
本内容全面解析了计算机存储系统的四大核心领域:虚拟存储技术、局部性原理、分级存储体系架构及存储器类型。虚拟存储通过软硬件协同扩展内存,支持动态加载与地址转换;局部性原理揭示程序运行特性,指导缓存设计优化;分级存储架构从寄存器到外存逐级扩展,平衡速度、容量与成本;存储器类型按寻址和访问方式分类,并介绍新型存储技术。最后探讨了存储系统未来优化趋势,如异构集成、智能预取和近存储计算等,为突破性能瓶颈提供了新方向。
|
10月前
|
存储 SQL 机器学习/深度学习
sentieon | 泛基因组分析流程详解
泛基因组:指的是一个物种所有个体中全部基因的集合。它不再依赖于单个参考基因组,而是承认没有任何一个个体能够拥有其物种的全部基因。
834 1
|
存储 缓存 关系型数据库
如何优化大表的查询速度?
本文介绍了优化大数据表查询速度的方法。关键点包括:1) 创建索引以加快查询;2) 优化查询语句,避免全表扫描;3) 使用缓存来提高查询效率,利用内存访问速度快和IO操作少的优势;4) 提升硬件配置,如使用固态硬盘和增加内存;5) 数据归档和分离,减少主表数据量;6) 实施数据库分片,如分库分表技术,以分散数据并提高并发性能。分库分表包括只分库、只分表(横向和纵向)以及两者结合,常见的分库分表中间件有ShardingSphere、MyCAT、TDDL和Vitess。这些策略通常结合使用,以应对大数据量查询的挑战。
1131 1
|
移动开发 JSON Kubernetes
k8s异常诊断之no space left on device.
某用户反馈,特定节点一直拉不起来pod,提示no space left on device.,手动去docker run也是相同的报错 # docker run --name aestools-perf --cap-add CAP_SYS_ADMIN --privileged -ti --rm registry-vpc.cn-beijing.aliyuncs.com/my-nettools/aestools:onlyperf docker: Error response from daemon: error creating overlay mount to /var/li
4030 135
|
存储 编解码 安全
如何使用UE Cesium插件实现网页端无算力负担访问?
虚幻引擎(UE)对设备性能要求较高,但通过其内置的像素流送插件和外部工具可优化运行效果。Cesium插件支持强大的在线地图数据获取功能,减少本地资源存储压力,但需依赖特定数字证书确保安全连接。为解决多人访问及低配设备运行问题,云渲染技术应运而生。平行云LarkXR实现跨平台无缝访问,并预先安装必要证书,简化部署流程。无论是公有云还是私有化方案,均可有效解决Cesium插件证书缺失等问题,提升应用体验与开发效率。
|
人工智能 自然语言处理 API
吴恩达开源aisuite:简化AI模型调用的新工具 | AI工具
近日,著名人工智能学者吴恩达教授在推特上宣布了他的最新开源项目——aisuite。这款全新的Python包旨在简化开发者与各大AI模型服务商的集成过程,极大提升了应用开发的效率。aisuite的推出,无疑为人工智能领域的开发者带来了一个强大而便利的工具。
950 5
|
机器学习/深度学习 数据可视化 数据挖掘
机器学习降维技术全面对比评析
机器学习降维技术全面对比评析
|
算法 数据中心 Python
基于python雪花算法工具类Snowflake-来自chatGPT
基于python雪花算法工具类Snowflake-来自chatGPT
587 4