三十、PHP框架Laravel学习笔记——模型的预加载

一.预加载

  1. 预加载,就是解决关联查询中产生的 N+1 次查询带来的资源消耗
  2. 我们要获取所有书籍的作者(或拥有者),普通查询方案如下:
    //获取所有书籍列表
$books = Book::all(); 

//遍历每一本书

foreach ($books as $book) { //每一本书的关联用户的姓名 DebugBar::info($book->user->username); 
}

在这里插入图片描述
在这里插入图片描述

PS:通过调试器 Debugbar 中 SQL 语句的分析,发现包含十多条 SQL 语句;
PS:原因是关联查询时,每遍历一次就会执行一遍 SQL 语句,导致性能欠佳;
PS:所谓 N+1 条,就是起初获取全部数据的 1 条和,遍历的 N 条;

  1. 使用 with()关键字,进行预载入设置,提前将 SQL 整合;
    //with 关键字预载入
$books = Book::with('user')->get(); 
foreach ($books as $book) { DebugBar::info($book->user->username); 
}

在这里插入图片描述

PS:此时的 SQL 执行数目为:1+1 条;也支持数组多个关联 with[‘book’,‘prifile’];
PS:预加载也可以设置显示的列;
//预载入设置指定的列

$books = Book::with('user:id,username')->get(); 

在这里插入图片描述

  1. 如果每次都必须使用预载入进行关联查询,可以在模型中定义;
protected $with = ['user']; 

在这里插入图片描述
在这里插入图片描述

PS:此时就可以像最初那样写代码,而不需要使用 with()方法了;

  1. 为了演示方便,暂时取消模型$with,再看下预载入结合筛选;
$books = Book::with(['user' => function ($query) { $query->where('id', 19); }])->get(); 

在这里插入图片描述
在这里插入图片描述

PS:预载入筛选不可以使用 limit、take 方法;

  1. 有时,可能会产生逻辑判断是否查询数据,但预加载会提前关联执行;

  2. 这样,会导致资源性能的浪费,这时,可以采用延迟预载入;

$books = Book::all(); 
if (true) { $books = $books->load('user'); //load(['user' => function () {}]) foreach ($books as $book) { DebugBar::info($book->user->username); } } 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 使用 loadCount()方法,可以实现延迟关联统计;
$users = User::all(); 
if (true) { return $users->loadCount('book'); 
}

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470522.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring3系列12-Spring AOP AspectJ

本文讲述使用AspectJ框架实现Spring AOP。 再重复一下Spring AOP中的三个概念, Advice:向程序内部注入的代码。Pointcut:注入Advice的位置,切入点,一般为某方法。Advisor:Advice和Pointcut的结合单元&#…

论文阅读:Spatial Transformer Networks

文章目录1 概述2 模型说明2.1 Localisation Network2.2 Parameterised Sampling Grid3 模型效果参考资料1 概述 CNN的机理使得CNN在处理图像时可以做到transition invariant,却没法做到scaling invariant和rotation invariant。即使是现在火热的transformer搭建的图…

dataframe 排序_疯狂Spark之DataFrame创建方式详解一(九)

创建DataFrame的几种方式1、读取json格式的文件创建DataFrame注意:1. json文件中的json数据不能嵌套json格式数据。2. DataFrame是一个一个Row类型的RDD,df.rdd()/df.javaRdd()。3. 可以两种方式读取json格式的文件。4. df.show()默认显示前20行数据。5.…

【原】npm 常用命令详解

今年上半年在学习gulp的使用,对npm的掌握是必不可少的,经常到npm官网查询文档让我感到不爽,还不如整理了一些常用的命令到自己博客上,于是根据自己的理解简单翻译过来,终于有点输出,想学习npm这块的朋友不可…

论文阅读 - CRNN

文章目录1 概述2 模型介绍2.1 输入2.2 Feature extraction2.3 Sequence modeling2.4 Transcription2.4.1 训练部分2.4.2 预测部分3 模型效果参考资料1 概述 CRNN(Convolutional Recurrent Neural Network)是2015年华科的白翔老师团队提出的,直至今日,仍…

python easygui_Python里的easygui库

想要用python开发一些简单的图形界面,于是接触了easygui库,由于这是新手教程,我会把它写的尽量简单,希望大家都能看懂。1.msgboxmsgbox( )有一个标题,内容和一个ok键(是可以更改的)。举个例子:import easyg…

Rust小技巧 - 让函数既可接受String或str,也可以返回String或str

文章目录1 场景说明2 解决方案2.1 允许不同的输入参数2.2 允许不同的输出参数2.3 让调用方来做处理参考资料1 场景说明 假设我们有一个函数foo,它既要允许&str也要允许String作为输入参数。或是既要允许&str也要允许String作为输出。&str和String之间的…

JSP九大内置对象(转载)

JSP中一共预先定义了9个这样的对象,分别为:request、response、session、application、out、pagecontext、config、page、exception 1、request对象 request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息&#xf…

recv发送失败 缓冲区太小_从 GFS 失败的架构设计来看一致性的重要性

作者简介 陈东明,饿了么北京技术中心架构组负责人,负责饿了么的产品线架构设计以及饿了么基础架 构研发工作。曾任百度架构师,负责百度即时通讯产品的架构设计。具有丰富的大规模系统构 建和基础架构的研发经验,善于复杂业务需求下…

Rust小技巧 - 把异步函数放进vector当中

文章目录1 场景说明2 解决方案2.1 无借用参数2.2 有借用参数参考资料1 场景说明 有些时候,我们希望将将异步函数放到vector当中,或者说是注册进vector当中,然后在某个地方遍历这个vector来实现对已经注册了的异步函数的调用。 Cargo.toml中…

好用的记事本_分类记事本软件哪个好用?大家推荐一个苹果手机用的分类记事本便签呗...

随着“互联网”的发展,现在都开始在软件上记事备忘了。那么,都有哪些好用的记事本软件可以选择使用呢?大家在选择记事本软件的时候,都有哪些标准呢?不知道大家的标准是什么,小编有一个不能妥协的标准&#…

tch-rs指南 - Tensor的基本操作

文章目录1 概述2 Tensor的基本操作2.1 Tensor的初始化(1)通过数组创建(2)通过默认方法创建(3)通过其他的tensor创建(4)通过opencv::core::Mat创建2.2 Tensor的属性2.3 Tensor的运算&…

命令行运行jmeter脚本

1、通过gui界面的jmeter创建一份脚本;2、打开cmd,切换到jmeter程序的Bin目录;3、执行jmeter.bat -n -t bookair_0613.jmx -l log_3.jtl;4、使用gui界面添加一个监听器,打开log_3.jtl文件,来分析测试结果。转载于:https…

bootstrap table 分页_Java入门007~springboot+freemarker+bootstrap快速实现分页功能

本节是建立在上节的基础上,上一节给大家讲了管理后台表格如何展示数据,但是当我们的数据比较多的时候我们就需要做分页处理了。这一节给大家讲解如何实现表格数据的分页显示。准备工作1,项目要引入freemarker和bootstrap,如果不知…

Rust小技巧 - 通过FFI编程运行tensorrt模型

文章目录1 概述2 使用说明2.1 配置说明2.2 修改c头文件2.3 编写build.rs2.4 测试参考资料1 概述 shouxieai/tensorRT_Pro是一个文档完善,效果也很不错的tensorrt库,里面有对yolov5,yolox,unet,bert,retina…

1+X web中级 Laravel学习笔记——查询构造器简介及新增、更新、删除、查询数据

一、新增数据 插入多条数据: 二、更新数据 更新某条数据: 自增某字段的值: 自减某字段的值: 自增的同时改变其他字段的值: 三、删除数据 四、查询 查面构造器查面数据 有以下几种方法 get(&…