thinkphp使用with对关联数据进行预加载
1、with('relation'),只预加载relation这个关联,如下面
public function relation() {
return $this->hasOne(Relation::class);
}
2、with(['relation', 'relation.relation1']),预加载relation以及,和relation关联的relation1
这种场景是Relation类中还定义了一个关联relation1
class Relation
{
public function relation1() {
return $this->hasOne(Relation1::class);
}
}
这样一来,一个with就把当前模型的关联relation以及relation的下级关联relation1查询出来了,
这对hasMany这种关联特别有好处,如果hasMany这种不使用预加载的话,每访问一次就会查询一次,而不是一次把多条关联数据查询出来。
测试:
数据库:两个表,一个是relation表,只有id字段;另一个是relation1表,除了id之外,还有关联relation表的relation_id。


控制器文件:
<?php namespace app\test\controller; use app\test\model\Relation;
use think\Controller; class Test extends Controller
{
public function test(Relation $relationModel)
{
/** @var \app\test\model\Relation[] $relations */
$relations = $relationModel->select();
foreach ($relations as $relation) {
/** @var \app\test\model\Relation $relation */
foreach ($relation->relation1 as $relation1) {
/** @var \app\test\model\Relation1 $relation1 */
echo $relation1->id . PHP_EOL;
}
}
} public function test1(Relation $relationModel)
{
/** @var \app\test\model\Relation[] $relations */
$relations = $relationModel->with('relation1')->select();
foreach ($relations as $relation) {
/** @var \app\test\model\Relation $relation */
foreach ($relation->relation1 as $relation1) {
/** @var \app\test\model\Relation1 $relation1 */
echo $relation1->id . PHP_EOL;
}
}
}
}
模型文件
Relation.php
<?php namespace app\test\model; /**
* Class Relation
* @package app\test\model
*
* @property Relation1[] relation1
*/
class Relation extends BaseModel
{
public function relation1()
{
return $this->hasMany(Relation1::class);
}
}
Relation1.php
<?php namespace app\test\model; /**
* Class Relation1
* @package app\test\model
*
* @property integer id
*/
class Relation1 extends BaseModel
{
}
结果:
不使用with预加载,每次循环都进行sql查询

使用预加载的时候,关联的数据只进行了一次查询:

thinkphp使用with对关联数据进行预加载的更多相关文章
- laravel 关联中的预加载
预加载 当作为属性访问 Eloquent 关联时,关联数据是「懒加载」的.意味着在你第一次访问该属性时,才会加载关联数据.不过,是当你查询父模型时,Eloquent 可以「预加载」关联数据.预加载避免 ...
- hibernate框架学习之数据抓取(加载)策略
Hibernate获取数据方式 lHibernate提供了多种方式获取数据 •load方法获取数据 •get方法获取数据 •Query/ Criteria对象获取数据 lHibernate获取的数据分 ...
- Entity Framework关联查询以及数据加载(延迟加载,预加载)
数据加载分为延迟加载和预加载 EF的关联实体加载有三种方式:Lazy Loading,Eager Loading,Explicit Loading,其中Lazy Loading和Explicit Lo ...
- django模型层优化(关联对象) 懒加载和预加载 +长链接
懒加载 存在于外键和多对多关系不检索关联对象的数据调用关联对象会再次查询数据库 问题根源 查看django orm的数据加载,两次. 查询user,查询menu 预加载的方法 预加载单个关联对象--s ...
- 防止ViewPager和Fragment结合使用时候的数据预加载
不知道你们使用ViewPager和Fragment结合的时候发现一个问题没,如果你的每个Fragment都需要请求网络数据,并且你在请求网络数据的时候会加入进度对话框的加载显示效果,当你显示第一个Fr ...
- android Viewpager取消预加载及Fragment方法的学习
1.在使用ViewPager嵌套Fragment的时候,由于VIewPager的几个Adapter的设置来说,都会有一定的预加载.通过设置setOffscreenPageLimit(int numbe ...
- entity framework 数据加载三种方式的异同(延迟加载,预加载,显示加载)
三种加载方式的区别 显示加载: 显示加载
- 【EF学习笔记08】----------加载关联表的数据 显式加载
显式加载 讲解之前,先来看一下我们的数据库结构:班级表 学生表 加载从表集合类型 //显示加载 Console.WriteLine("=========查询集合===========&quo ...
- Java 并发专题 :FutureTask 实现预加载数据 在线看电子书、浏览器浏览网页等
继续并发专题~ FutureTask 有点类似Runnable,都可以通过Thread来启动,不过FutureTask可以返回执行完毕的数据,并且FutureTask的get方法支持阻塞. 由于:Fu ...
随机推荐
- 爬虫2.4-scrapy框架-图片分类下载
目录 scrapy框架-图片下载 1 传统下载方法: 2 scrapy框架的下载方法 3 分类下载完整代码 scrapy框架-图片下载 python小知识: map函数:将一个可迭代对象的每个值,依次 ...
- Quartz学习--三 Hello Jdbc Quartz! 和 demo 结尾
四. Hello JDBC Quartz! JDBC方式: 就是说通过数据库的jdbc链接来进行quartz的一个配置 Quartz支持了很好的支持 demo用例 使用mysql作为例子进行演示 相比 ...
- 套接口socket编程(Client/Server编程实例)
基本概念 套接口也就是网络中的ID.网络通信,归根到底还是进程间通信(不同计算机上的进程间的通信).在网络中,每一个节点(计算机或路由器)都有一个网络地址,也就是IP地址. IP地址:在网络中唯一标识 ...
- 华为笔试——C++转换字符串问题
题目:转换字符串 题目介绍: 将输入字符串中下标为偶数的字符连成一个新的字符串输出,需要注意两点: 1. 如果输入字符串的长度超过20,则转换失败,返回“ERROR!”字符串: 2. 输入字符串只能由 ...
- git blame 查看某行代码提交记录
1. 在当前git项目目录下执行 git blame -L 38,38 <filename> 例子: git blame -L 38,38 src/component/BarCode/i ...
- C++:const用法的简单总结
一.对变量的修饰 在c++中,如果我们希望定义一个值不会被改变的变量,那么可以用关键字const对它进行修饰,被修饰后的变量其作用相当于一个常量 //这两种方式等价 2 语法1:const 类型名 变 ...
- WOL*LAN远程换醒命令行方法
wol远程唤醒需要网卡的支持,现在一般的网卡也都支持,只有有线网络能实现. 这里介绍Wake On Lan Command Line的使用 下载地址 https://www.depicus.com/w ...
- Ribbon源码解析
SpringCloud中的Ribbon开源项目,提供了客户端的负载均衡算法.这篇文章,我们来介绍下他是如何实现的.为了方便理解,我们以客户端调用的流程来介绍,其中会穿插介绍相关源代码. 简单回顾下Ri ...
- Java多线程编程(学习笔记)
一.说明 周末抽空重新学习了下多线程,为了方便以后查阅,写下学习笔记. 有效利用多线程的关键是理解程序是并发执行而不是串行执行的.例如:程序中有两个子系统需要并发执行,这时候需要利用多线程编程. 通过 ...
- CF708C-Centroids
题目 一棵树的重心定义为一个点满足删除这个点后最大的连通块大小小于等于原来这颗树大小的一半. 给出一棵树,一次操作为删除一条边再添加一条边,操作结束后必须仍为一棵树.问这颗树的每个点是否可以通过一次操 ...