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 ...
随机推荐
- CSP201403-3:命令行选项
引言:CSP(http://www.cspro.org/lead/application/ccf/login.jsp)是由中国计算机学会(CCF)发起的"计算机职业资格认证"考试, ...
- spring-boot断点调试(IDEA)
- Spark配置参数的三种方式
1.Spark 属性Spark应用程序的运行是通过外部参数来控制的,参数的设置正确与否,好与坏会直接影响应用程序的性能,也就影响我们整个集群的性能.参数控制有以下方式:(1)直接设置在SparkCon ...
- Qt中容器类应该如何存储对象
Qt提供了丰富的容器类型,如:QList.QVector.QMap等等.详细的使用方法可以参考官方文档,网上也有很多示例文章,不过大部分文章的举例都是使用基础类型:如int.QString等.如果我们 ...
- win10 tomcat不能访问问题
问题描述:电脑是Win10系统的,安装了Tomcat后,本机通过80端口能顺利访问.但局域网内的其他机器却无法访问这台电脑的Tomcat服务. 故障分析: 将防火墙关闭后,可以访问,所以问题就出在防火 ...
- socket发送文字、图片、文件---基于python实现
socket官方文档:https://docs.python.org/2/library/socket.html socket中文详细介绍:http://blog.csdn.net/rebelqsp/ ...
- Thunder团队第七周 - Scrum会议3
Scrum会议3 小组名称:Thunder 项目名称:i阅app Scrum Master:李传康 工作照片: 参会成员: 王航:http://www.cnblogs.com/wangh013/ 李传 ...
- c# 读取blob数据
Stream stream = new MemoryStream(data); BinaryReader r = new BinaryReader(stream); int iRawImageWidt ...
- Saver 保存与读取
tensorflow 框架下的Saver 功能,用以保存和读取运算数据 Saver 保存数据 代码 import tensorflow as tf # Save to file #remember t ...
- 作业三C++
作业心得 1.本次作业开始使用C++编写了(面向过程的C++,2333) 2.粗略学习了一下文件输入输出,和项目的创建等(在大佬眼里最基本的操作QAQ,然而我还是有点晕晕的,平时都是ctrl+n新建源 ...