前言

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模式调用关联表的字段是查不到关联数据的

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字段的理解的更多相关文章

  1. 在mybatis框架中,延迟加载与连表查询的差异

    1.引子 mybatis的延迟加载,主要应用于一个实体类中有复杂数据类型的属性,包括一对一和一对多的关系(在xml中用collection.association标签标识).这个种属性往往还对应着另一 ...

  2. Yii框架中使用SRBAC作为权限管理模块时遇到的问题

    Yii框架中使用SRBAC作为权限管理模块时遇到的问题   看到Yii中提供RBAC的插件,SRBAC,就想用用. 结果按照手册上的安装办法,整来整去,安装完了,可就是进不了权限管理界面. 最后想到, ...

  3. DRF框架中链表数据通过ModelSerializer深度查询方法汇总

    DRF框架中链表数据通过ModelSerializer深度查询方法汇总 一.准备测试和理解准备 创建类 class Test1(models.Model): id = models.IntegerFi ...

  4. Srping框架中使用@query注解实现复杂查询

    [自己项目代码] @Query("select bean from User bean where bean.org.id=?1 and bean.group.id=?2") pu ...

  5. thinkphp中如何是实现多表查询

    多表查询经常使用到,但如何在thinkphp中实现多表查询呢,其实有三种方法. 1 2 3 4 5 6 7 8 9 10 11 12 // 1.原生查询示例: $Model = new Model() ...

  6. hive中为分区表增加字段需要注意默认不会修改已有分区的字段,导致查询时新增字段为null

    若向hive表添加字段,通常会使用下面这种语句 alter table default.testparquet add columns(c8 string); 但是对于分区表来说, 1. 若新建的分区 ...

  7. fastadmin 框架中图片点击放大

    fastadmin的原生图片预览,重新打开一个窗口太麻烦,使用layui做一个弹窗式的图片预览 1.将下面代码放在backend-init.js文件中 $('body').on('click', '[ ...

  8. lavarel框架中如何使用ajax提交表单

    开门见山,因为laravel以post形式提交数据时候需要加{{csrf_field()}}防止跨站攻击,所以当你用ajax提交表单时候自然也要加 在网上看了很多的解决方式,我是用下面这种方法解决的: ...

  9. springboot中使用JOIN实现关联表查询

    * 首先要确保你的表和想要关联的表有外键连接 repository中添加接口JpaSpecificationExecutor<?>,就可以使用springboot jpa 提供的API了. ...

  10. KindEditor使用过程中,用JQ提交表单时,获取不到编辑器的内容

    首先要说明的是.在使用提交button直接提交时.编辑器的内容是能够正常获取的,而使用 jq或js ,如$("#form").submit(),提交时,则编辑器的内容是无法获取的. ...

随机推荐

  1. 如何将 iPad 用作 Windows 计算机的第二台显示器?

    安装第二台显示器是扩大屏幕空间的一种常用方法.如果您偶尔只需要第二个显示器(例如您偶尔在家中工作),但又不想购买整个第二个显示器,则可以将 iPad 用作廉价的替代品. 要将 iPad 用作Windo ...

  2. 关于Nacos身份认证绕过漏洞默认密钥和JWT的研究

    前言 由于本人的一个习惯,每次遇到漏洞并复现后都要编写poc,以便下一次的直接利用与复测使用.研究Nacos默认密钥和JWT的爱恨情仇的过程中遇到了莫名其妙的问题,在此做以记录,方便日后有大佬遇到相同 ...

  3. vue多页面应用

    多页面应用本身和单页面应用没什么差别,无非是多了几个入口点. 入口点多的话,还可以写个函数扫描路径取添加入口点. 比较让人好奇的是路径的问题.我们要开发的时候要体现目录层级接口,所以入口文件是一层套一 ...

  4. 开源项目 cloud-platform 的本地部署

    F7 单步调试,进入函数内部 F8 单步调试,不进入函数内部 F9 继续执行,进入下一个断点或执行完程序 Shift+F7 选择要进入的函数 Shift+F8 跳出函数 Ctrl+F8 设置/取消当前 ...

  5. 公司es扩容kibana添加密码访问

    准备工作 基础优化[部署好的es无需操作,新server操作] setenforce 0 getenforce sed -i 's#^SELINUX=.*$#SELINUX=disabled#g' / ...

  6. RTOS官方文档学习

    任务与协程 区别 一个程序可以只有任务.只有协程.二者都有,但不可以通过队列/信号量互相传递数据 任务特点 任务之间可以互相独立 每个任务分配自己的堆栈,提高了RAM使用率 操作简单.按优先级抢占式执 ...

  7. Java 集合的概念

    目录 集合 单列集合(Collection) Collection中的一些方法 public static < T > boolean addAll(Collection<? sup ...

  8. kettle从入门到精通 第二十四课 kettle 部署生产常用命令

    一.设置KETTLE_HOME环境变量 假设kettle软件目录为/xxx/data-integration vi ~/.bash_profile export KETTLE_HOME=/xxx/da ...

  9. 让Easysearch运行在Kylin V10 (Lance)-aarch64上

    简介 本文主要介绍在国产操作系统 Kylin V10 (Lance)-aarch64 上安装单机版 Easysearch/Console/Agent/Gateway/Loadgen 系统配置 在安装之 ...

  10. 使用 nsenter 排查容器网络问题

    需求 我想进入容器中执行 curl 命令探测某个地址的连通性,但是容器镜像里默认没有 curl 命令.我这里是一个内网环境不太方便使用 yum 或者 apt 安装,怎么办? 这个需求比较典型,这里教大 ...