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 ...
随机推荐
- 设置PNG图片DPI 信息,保存为PDF(使用Magick),与OpenCV转换
目录 任务描述 解决方案 Magick++ Talk is cheap, show me the code. 与 Opencv 配合 相关链接 任务描述 我有这样一个需求,读取一张格式为PNG 或者 ...
- 生成dataset的几种方式
1.常用的方式通过sparksession读取外部文件或者数据生成dataset(这里就不讲了) 注: 生成Row对象的方法提一下:RowFactory.create(x,y,z),取Row中的数据 ...
- Tensorflow框架之AlexNet
from datetime import datetime import math import time import tensorflow as tf batch_size=32 num_batc ...
- 华为笔试——C++转换字符串问题
题目:转换字符串 题目介绍: 将输入字符串中下标为偶数的字符连成一个新的字符串输出,需要注意两点: 1. 如果输入字符串的长度超过20,则转换失败,返回“ERROR!”字符串: 2. 输入字符串只能由 ...
- python3【基础】-集合
集合( set):把不同的元素组成一起形成集合,是python基本的数据类型. 集合元素(set elements):组成集合的成员(不可重复) class set(object) | set() - ...
- __autoload 与spl_autoload_register()
PHP __autoload函数(自动载入类文件)的使用方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-02-04 在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都 ...
- Alpha发布——美工+文案展示博客
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2283 文案: 学海无涯苦作舟,深海的远帆扬起成长的新程. 我将一滴水滴注 ...
- hdu1010--Tempter of the Bone(迷宫)
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1010 Tempter of the Bone Time Limit: 2000/1000 MS (Jav ...
- sql数据库表容量
标题:SQL Server 的最大容量规范 数据库的文件大小,文件数量都有限制. 表的大小也有限制,如果表过大,查询效率就会下降,考虑对数据进行分割,对历史数据进行独立存储.
- StringBuilder、StringBuffer和String三者的联系和区别
String 类 String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间. String a = "a ...