Laravel技巧:使用load、with预加载 区别

Laravel技巧:使用load、with预加载 区别

1、使用load

  1. $posts = Post::all();

  2. $posts->load(
    ‘user’);

2、使用with

$posts = Post::with('user')->all();

懒加载是什么意思呢?

两张表,目录表和教材表。多个教材属于一个目录,那么利用懒加载,你就可以通过先把目录读出来,然后把这些与目录有关的教材一下子读出来完。这样进行数据库读取的次数就少了。

所以我从国外的一个网站上搬来了with和load的用法,大家自行领悟吧。

Both accomplish the same end results—eager loading a related model onto the first. In fact, they both run exactly the same two queries. The key difference is that with() eager loads the related model up front, immediately after the initial query (all(), first(), or find(x), for example); when using load(), you run the initial query first, and then eager load the relation at some later point.

“Eager” here means that we’re associating all the related models for a particular result set using just one query, as opposed to having to run n queries, where n is the number of items in the initial set.

Eager loading using with()

If we eager load using with(), for example:

$users = User::with('comments')->get(); 

if we have 5 users, the following two queries get run immediately:

select * from `users` select * from `comments` where `comments`.`user_id` in (1, 2, 3, 4, 5) 

…and we end up with a collection of models that have the comments attached to the user model, so we can do something like $users->comments->first()->body.

“Lazy” eager loading using load()

In this approach, we can separate the two queries, first by getting the initial result:

$users = User::all(); 

which runs:

select * from `users` 

And later, if we decide(based on some condition) that we need the related comments for all these users, we can eager load them after the fact:

if($someCondition){  $users = $users->load('comments'); } 

which runs the 2nd query:

select * from `comments` where `comments`.`user_id` in (1, 2, 3, 4, 5) 

And we end up with the same result, just split into two steps. Again, we can call $users->comments->first()->body to get to the related model for any item.

Conclusion

When to use load() or with()?

load() gives you the option of deciding later, based on some dynamic condition, whether or not you need to run the 2nd query.

If, however, there’s no question that you’ll need to access all the related items, use with().

 



先说说 关联查询:我们在 Model 类里定义的关联,我们不一定在第一次查询就全部查出来,我们可以在需要的时候再去查询 ,使用 load 方法,可以实现这个目标,
但是这个 load 只是针对单个 model 对象的
如果我们 Model::xxx()->xx() 链式操作最后是 get(),我们得到的结果将会是一个 Collection 实例,
最后调用的方法是 first() 或其他类似的 firstOrFail() 的时候,返回的才是一个 Model 实例
也就是说 load 方法只针对 Model 实例。如下:

总结:with 一步等于执行了两步,
load 分开执行两步

参考:https://www.cnblogs.com/cjjjj/p/9839725.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/112398.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 计算机网络实验四访问控制列表NAT应用

    计算机网络实验四访问控制列表NAT应用计算机网络实验四访问控制列表NAT应用

  • 各代iphone尺寸_iphone屏幕尺寸比例是多少,iphone各代屏幕尺寸大小介绍

    各代iphone尺寸_iphone屏幕尺寸比例是多少,iphone各代屏幕尺寸大小介绍自2007年苹果发布第一代iPhone以来,到目前最新的iPhoneXS、XSMax,苹果累计发布了21款手机,涉及7款尺寸,8种分辨率。那么这么多的不同手机之间有什么内在联系吗?为什么在iPhone6代-8代之间,屏幕是4.7寸和5.5寸,而iPhoneXS和Max分别是5.8寸和6.5寸,他们之间有什么联系吗?XR为什么分辨率这么低,被吐槽是大果粒屏?仔细看完本文,你将对iPhone的设…

  • Vue双向绑定原理(4改)

    Vue双向绑定原理(4改)Vue双向绑定的原理 双向数据绑定是通过数据劫持、结合、发布订阅,的方式来实现的,也就是说数据和视图同步,数据发生变化,视图跟着变化,视图变化,数据也随之发生改变; 使用watch来连接数据与视图,当数据发生变化时,触发通知所有该数据的对象进行更新。这!就是vue的双向绑定原理,你学会了吗?…

    2022年10月18日
  • virsh命令行_怎么进入命令行窗口

    virsh命令行_怎么进入命令行窗口[@TOC]定义存储池与其目录创建已定义的存储池激活并自动启动已定义的存储池在存储池中创建虚拟机存储卷kvm存储池主要体现一种管理方式,可以通过挂载存储目录,lvm逻辑卷的方式创建存储池,虚拟机存储卷创建完成后,剩下的操作与无存储卷的方式无任何区别KVM存储池也要用于虚拟机迁移任务存储池相关管理命令二、生产环境存储池使用添加lvm和远程存储即可rawqcowqocw2qed什么是写时拷贝四、挂载磁盘使用libguestfsLinux工具可以在虚拟机无

  • LMS波束形成

    LMS波束形成LMS自适应波束形成器%标量阵最小均方准则(LMS)自适应波束形成器(ADBF)closeall;Sound_velocity=1200;%声速Frequency=300;%信号频率Sample_Frequency=100Frequency;%采样频率Array_num=16;%阵元数Array_distance=1/2(Sound_velocity/Frequency)…

  • centos7.4安装docker_docker安装python库

    centos7.4安装docker_docker安装python库前言当我们在一台电脑上搭建了python3.6的环境,下次换台电脑,又得重新搭建一次,设置环境变量等操作。好不容易安装好,一会提示pip不是内部或外部命令,一会又提示pip:commandno

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号