【PHP】关于fastadmin框架中使用with进行连表查询时setEagerlyType字段的理解

php,fastadmin,with,seteagerlytype · 浏览次数 : 70

小编点评

前言:FastAdmin是一款基于ThinkPHP和Bootstrap构建的开源后台管理框架,具有完善的功能和便捷的开发体验。本文将介绍setEagerlyType的概念、使用方法和相关问题。 1. setEagerlyType简介 setEagerlyType是FastAdmin中用于设置关联查询预载入方式的功能。它分为0和1两种模式,分别表示JOIN方式和IN方式。在V5.0.4+版本中,支持一对一关联预载入。 2. 使用示例 2.1 使用JOIN方式 在模型层定义关联关系时,使用setEagerlyType(0)设置预载入方式为JOIN方式。例如: ```php public function product() { return $this->belongsTo('app\common\model\xxxx\xxxxx', 'PID', 'PID', [], 'LEFT'); } ``` 2.2 使用IN方式 在模型层定义关联关系时,使用setEagerlyType(1)设置预载入方式为IN方式。例如: ```php public function product() { return $this->belongsTo('app\common\model\xxxx\xxxxx', 'PID', 'PID', [], 'LEFT'); } ``` 3. 查询速度对比 通常情况下,使用JOIN查询的速度比IN子查询更快。这是因为数据库优化器在执行查询计划时可以更有效地处理JOIN操作,而且JOIN操作可以使用索引来加速数据检索。 4. 关于setEagerlyType(1)的疑问 如果在实际使用中发现使用JOIN查询时查询速度很慢,而使用IN查询时查询速度较快,可能有以下原因: - 数据库索引:检查关联表是否已经建立了合适的索引,以加速查询。 - 查询优化:检查查询语句是否已经优化,避免使用不必要的JOIN操作。 - 数据量差异:由于JOIN查询涉及多张表,可能查询时间较长,可以考虑分页查询或者在业务层进行数据处理。 总结:本文介绍了FastAdmin中的setEagerlyType功能,以及如何在不同情况下选择合适的预载入方式。在实际开发中,可以根据查询需求和性能考虑选择JOIN或IN方式。如有疑问,请在评论区留言讨论。

正文

前言

FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一款开源且免费商用的后台开发框架,它基于ThinkPHP和Bootstrap两大主流技术构建的极速后台开发框架,它有着非常完善且强大的功能和便捷的开发体验,使我逐渐喜欢上了它。

什么是setEagerlyType?

1.回归正题,什么是setEagerlyType?

setEagerlyType是fastadmin在使用关联查询时提供的配置字段,为设置预载入方式。根据官方文档描述,在V5.0.4+版本开始一对一关联预载入支持两种方式:setEagerlyType(0) 是JOIN方式(一次查询) setEagerlyType(1)是IN方式(两次查询)。

2.例子

2.1 当使用join的方式(setEagerlyType(0))

在model层对应的model文件加入该函数 $this->belongsTo(被关联表,外键, 主键, [], 'LEFT')->setEagerlyType(关联模式 0/1 );

public function product()
    {
        return $this->belongsTo('app\common\model\xxxx\xxxx',  'PID', 'PID', [], 'LEFT')->setEagerlyType(0);
    }
//此处返回的是一个二维数组
$List=$this->xxxxModel->with('product')->page($page, $pageSize)->select();

因为返回的是一个二维数组所以可以使用关联表中的字段product.name='xxx'

$whiskybaseList=$this->xxxxxModel->with('whiskybaseProduct')->where('product.name','xxx')->page($page, $pageSize)->select();

当然,如果需要关联多张表也可以把with中的参数写成数组形式

$whiskybaseList=$this-xxxxModel->with(['pProduct','xxxxxxxxx','xxxxx'])->page($page, $pageSize)->select();

2.2 当使用In的方式(setEagerlyType(1))

public function product()
    {
        return $this->belongsTo('app\common\model\xxxx\xxxx',  'PID', 'PID', [], 'LEFT')->setEagerlyType(1);
    }
//此处返回的是一个一维数组
$whiskybaseList=$this->xxxxModel->with('product')->page($page, $pageSize)->select();

因为使用的是IN模式,返回的是一个一维数组所以无法使用关联表中的字段product.name='xxx'

$whiskybaseList=$this->xxxxModel->with('product')->where('product.name','xxx')->page($page, $pageSize)->select();

使用IN模式调用关联表的字段是查不到关联数据的
image

3.请求速度

通常情况下使用 JOIN 操作比 IN 子查询更快。这是因为数据库优化器在执行查询计划时能够更有效地处理 JOIN 操作,而且 JOIN 操作可以使用索引来加速数据检索。

4.疑问

我前段时间使用关联表的时候就遇到了一个问题,很奇怪,希望知道的大佬评论区指点一下!

问题!

就是公司要求我爬取国外的一个网站的数据,导入平台作为借鉴,然后爬取并清理完数据以后,一张是产品表,里面有一个PID对应着产品详情表的PID,所以我在做查询时我需要关联详情表的PID获取详情,数据的话产品表与详情表都各15w条数据,而且我将PID设置为索引了已经,然而当我在做分页查询时,使用的是join查询,查询100s都没出结果,但是我使用IN查询,0.1s既有结果,这又是为什么?代码如下

model层

public function whiskybaseProduct()
    {
        return $this->belongsTo('app\common\model\Whiskybase\Whiskybase',  'PID', 'PID', [], 'LEFT')->setEagerlyType(1);
    }

业务层

//因为查询的数据字段基本大部分要用到,所以也没有使用field去指定返回什么字段,虽然这样能快一丢丢
$whiskybaseList=$this->WhiskybasedetailModel->where('title_zh', 'LIKE', '%' . $keyWord . '%')->with('whiskybaseProduct')->page($page, $pageSize)->order($sort, 'asc')->select();

业务层不变,model层setEagerlyType(1)改为IN方式setEagerlyType(0),查询速度从0.1s变为100s+
如果有大佬知道,请评论区指导一下~谢谢!

上述为个人整理内容,水平有限,如有错误之处,望各位园友不吝赐教!如果觉得不错,请点击推荐和关注!谢谢~๑•́₃•̀๑ [鲜花][鲜花][鲜花]

与【PHP】关于fastadmin框架中使用with进行连表查询时setEagerlyType字段的理解相似的内容:

【PHP】关于fastadmin框架中使用with进行连表查询时setEagerlyType字段的理解

FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一款开源且免费商用的后台开发框架,它基于ThinkPHP和Bootstrap两大主流技术构建的极速后台开发框架,它有着非常完善且强大的功能和便捷的开发体验,使我逐渐喜欢上了它。

漏洞复现之CVE-2012-1823(PHP-CGI远程代码执行)

关于CGI知识点 CGI模式下的参数: -c 指定php.ini文件的位置 -n 不要加载php.ini文件 -d 指定配置项 -b 启动fastcgi进程 -s 显示文件源码 -T 执行指定次该文件 -h和-? 显示帮助 题目如下图,没有什么发现 目录扫描一下 dirsearch -u http:

php不使用Office包实现上万条数据导出表格

经过上传客户要求主副表迁出,又提出可以将某张表的数据导出excel,听着很简单,实际看数据表发现上万条数据,并且需要关联表查询相关字段,导出的表格才可以被客户看明白。 要是使用office包目前后台内存耗尽,被迫停止运行,所以想要突破百万条数据导出需要另辟它路。所以就是使用了导出CSV并非excel

PHP 程序员为什么依然是外包公司的香饽饽?

PHP 唯一的爽点就是开发起来「哇真快」这刚好和外包公司的需求相契合,在 Web 领域的芒荒年代 PHP 以王者姿态傲视群雄。

硬核案例分享,一文带你拆解PHP语言体系下的容器化改造

本文介绍了PHP语言体系应用现代化案例,实现了许多与业务无关的通用性应用改造方案,如PHP应用容器化架构方案、基于Prometheus的弹性伸缩方案等等,为此类型客户提供了一个可参考的案例。

PHP 真的不行了?透过 PHP 的前世今生看真相

大家好,我是码农先森。 1994年我出生在湖南的农村,就在同年加拿大的拉斯姆斯·勒多夫创造了 PHP,这时的 PHP 还只是用 Perl 编写的 CGI 脚本。或许是时间的巧合 PHP 变成了我后半生谋生的手段,当时拉斯姆斯·勒多夫写这些脚本的目的,只是为了统计自己网站的访问者。就是这样一个简单的目

php反序列化个人笔记

反序列化 什么是反序列化? 格式转换 序列化:对象转换为字符串或者数组等格式 反序列化:将数组或字符串转换成对象 为什么会出现安全漏洞? 魔术方法 如何利用漏洞? 通过构造pop链,找到代码的逻辑漏洞,进行getshell,rce等操作 反序列化利用分为三类 魔术方法的调用逻辑 语言原生类的调用逻辑

七年之痒!一个 PHP 程序员职业生涯的自述

作为一名程序员常常都是与代码为伴,平常写个技术文档或PPT都费劲的人,竟然不知不觉地写了这么多文字,我也是感到十分的惊讶。17年毕业到今年刚好七年了,俗话说七年之痒,这一次的自述也算是对自己一个职业生涯的复盘了。

PHP转Go系列 | ThinkPHP与Gin框架之OpenApi授权设计实践

工作中只要接触过第三方开放平台的都离不开 OpenApi,几乎各大平台都会有自己的 OpenApi 比如微信、淘宝、京东、抖音等。在 OpenApi 对接的过程中最首要的环节就是授权,获取到平台的授权 Token 至关重要。

PHP 程序员是学 Swoole ?还是学 Go ?

这次为什么要讨论这个话题,因为 Swoole 和 Go 在 PHP 程序员坊间一直都是茶语饭后的谈资,觉得懂 Swoole 和 Go 的就高人一等。