Laravel渴求式加载(比较容易理解理解load与with关系)
渴求式加载
当以属性方式访问 Eloquent关联关系的时候,关联关系数据是「懒惰式加载」的,这意味着关联关系数据直到第一次访问的时候才被加载。不过,Eloquent 还可以在查询父级模型的同时「渴求式加载」关联关系。渴求式加载缓解 N+1 查询问题,要阐明 N+1 查询问题,查看关联到 Auth的 Book模型:
Laravel学院文档: https://laravelacademy.org/post/9584.html
根据官方文档, 创建两个表,不多说.
新建两个model模型
php artisan make:model Auth
php artisan mkae:model Book
然后创建对应的表关联关系
<?php
namespace App; use Illuminate\Database\Eloquent\Model; class Book extends Model
{
protected $table = 'book'; public function auth()
{
return $this->belongsTo('App\Auth');
}
}
在控制器中获取书的作者信息
public function lst()
{
$books = Book::all(); foreach ($books as $book){
echo $book->auth->name;
}
}
去页面查看输出信息和SQL语句
这里发现 其实这里是执行了5条sql语句,在foreach循环中,每一次都执行了一条sql语句
文档中的解释:
该循环先执行 1 次查询获取表中的所有书,然后另一个查询获取每一本书的作者,因此,如果有25本书,要执行26次查询:1次是获取书本身,剩下的25次查询是为每一本书获取其作者。
在这里 我们使用渴求式加载. 当查询的时候,可以使用 with方法指定应该被渴求式加载的关联关系:
public function lst()
{
$books = Book::with('auth')->get(); foreach ($books as $book){
echo $book->auth->name;
}
}
查看输出结果,发现,效果一样,但原本执行的多条sql 变成了两条

渴求式加载多个关联关系
有时候你需要在单个操作中渴求式加载多个不同的关联关系。要实现这个功能,只需要添加额外的参数到with方法即可:
在这里,我又新建了一个category表
在Book模型中又加了一个与category表的关联关系
public function category()
{
//这里我在book表中与category表关联的外键字段是cate_id,而laravel中默认是category_id,所以修改第二个参数为cate_id
return $this->belongsTo('App\Category','cate_id');
}
修改代码
public function lst()
{
$books = Book::with('auth','category')->get(); foreach ($books as $book){
echo $book->category->name;
echo $book->auth->name;
}
}
查看页面输出结果,这里将category表中的数据也查出来了
嵌套的渴求式加载
要渴求式加载嵌套的关联关系,可以使用”.“语法。例如,我们在一个 Eloquent 语句中渴求式加载所有书的作者及所有作者的个人联系方式:
$books = Book::with('auth.contact')->get();
这里还需要新建一个contact表,存放作者的联系方式
然后新建一个Contact模型,并在Auth模型中关联上Contact模型
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Auth extends Model
{
protected $table = 'auth'; public function contact()
{
return $this->belongsTo('App\Contact');
}
}
然后修改控制器中的代码
public function lst()
{
//通过 . 点号 来加载auth模型的contact关联表
$books = Book::with('auth.contact')->get(); echo '<pre>'; foreach ($books as $book){
echo $book->name;
echo '<br/>';
echo $book->auth->name;
echo '<br/>';
echo $book->auth->contact->email;
echo '<hr/>';
}
}
查看页面输出信息,这里将auth关联的contact表的信息也查出来了.
渴求式加载指定字段
并不是每次获取关联关系时都需要所有字段,因此,Eloquent 允许你在关联查询时指定要查询的字段:
$users = Book::with('auth:id,name')->get();
注:使用这个特性时,id字段是必须列出的。
public function lst()
{
$books = Book::with('auth:id,name')->get()->toArray();
dd($books);
}
查看页面输出代码 auth下只有id和name两个字段了 其他多余的字段都没有了

带条件约束的渴求式加载
有时候我们希望渴求式加载一个关联关系,但还想为渴求式加载指定更多的查询条件:
$books = Book::with(['auth' => function ($query) {
//约束条件
$query->where('name', 'like', '吴%');
}])->get();
dd($books);
查看页面输出信息,只有auth表中name字段以吴开头的信息查出来了,其他的都没查出来
在这个例子中,Eloquent 只渴求式加载 name 以吴开头 的作者。当然,你还可以调用其它查询构建器来自定义渴求式加载操作:
$books = Book::with(['auth' => function ($query) {
$query->orderBy('name', 'desc');
}])->get();
懒惰渴求式加载
有时候你需要在父模型已经被获取后渴求式加载一个关联关系。例如,这在你需要动态决定是否加载关联模型时可能很有用:
$books = Book::all();
$res = true;
if($res){
$books->load('auth','category');
}
dd(collect($books)->toArray());
如果你需要设置更多的查询条件到渴求式加载查询上,可以传递一个包含你想要记载的关联关系数组到 load 方法,数组的值应该是接收查询实例的闭包:
$books->load(['auth' => function ($query) {
$query->orderBy('name', 'asc');
}]);
如果想要在关系管理尚未被加载的情况下加载它,可以使用 loadMissing 方法:
public function lst(Book $book)
{
$book->loadMissing('auth'); return [
'name' => $book->name,
'auth' => $book->auth->name
];
}
最后这个…试了很久,在大佬的帮助下完成了.
直接从文档复制过来就报错了!!!坑啊
需要在路由那传递一个id
Route::get('book/{id}','ArticleController@lst');

去掉loadMissing之后…下面那行sql语句变了,但是感觉没啥用啊.不知道这个东西有什么用.

原文:https://blog.csdn.net/u013032345/article/details/82772938
Laravel渴求式加载(比较容易理解理解load与with关系)的更多相关文章
- laravel 嵌套的渴求式加载
今天在通过需求表A查询场地类型表B,然后通过表B的场地类型id去查询表C场地类型名的时候遇到了一个小的问题. 需求表A的字段:id.user_id .name等等: 中间表B的字段:id.appeal ...
- laravel with嵌套的渴求式加载
今天在通过需求表A查询场地类型表B,然后通过表B的场地类型id去查询表C场地类型名的时候遇到了一个小的问题. 需求表A的字段:id.user_id .name等等: 中间表B的字段:id.appeal ...
- Laravel 5.2数据库--多个关联关系,带条件约束的渴求式加载的问题
### 今天在连表获取数据的时候,老是获取不到想要的,确实有点无力适从的感觉. 归根到底,还是对laravel不够熟悉,至少是数据库操作那块. ### 问题是这样的: 我想要通过连表中间表,拿中间表的 ...
- laravel with 渴求式加载指定字段
在使用 Laravel 的关联查询中,我们经常使用 with 方法来避免 N+1 查询,但是 with 会将目标关联的所有字段全部查询出来,对于有强迫症的我们来说,当然是不允许的. 这时候我们可以使用 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (28) ------ 第五章 加载实体和导航属性之测试实体是否加载与显式加载关联实体
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-11 测试实体引用或实体集合是否加载 问题 你想测试关联实体或实体集合是否已经 ...
- 【EF学习笔记08】----------加载关联表的数据 显式加载
显式加载 讲解之前,先来看一下我们的数据库结构:班级表 学生表 加载从表集合类型 //显示加载 Console.WriteLine("=========查询集合===========&quo ...
- dll显式加载与隐式加载
使用动态DLL有两种方法,一种是隐式链接,一种是显式链接,如果用loadlibrary就是显示链接,用lib就属于隐式链接. 两种方法对于你的程序调用动态库时没有任何区别,只是你在编程时,步骤是不一样 ...
- 用video标签流式加载
video标签 浏览器的video标签通常是接收一个src属性,然后浏览器就会根据这个src属性来自动加载视频.这个过程是浏览器来加载video的. 这种方式有什么问题吗? mp4文件不能流式加载 w ...
- PHP autoload与spl_autoload自动加载机制的深入理解
PHP autoload与spl_autoload自动加载机制的深入理解 作者: 字体:[增加 减小] 类型:转载 时间:2013-06-05我要评论 本篇文章是对PHP中的autoload与spl_ ...
随机推荐
- 【转】vue父子组件之间的通信
vue父子组件之间的通信 在vue组件通信中其中最常见通信方式就是父子组件之中的通性,而父子组件的设定方式在不同情况下又各有不同.最常见的就是父组件为控制组件子组件为视图组件.父组件传递数据给子组件使 ...
- LNMP安装,FastCGI说明
1.1.工作原理讲解说明 1. 用户请求的静态文件,由nginx服务器处理,根据静态的location配置进行处理 用户请求的动态文件,由php服务进行处理,根据动态的location配置进行处理 2 ...
- 4-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案数据篇(云端电脑(Windows)安装配置数据库,使用本地Navicat for MySQL和手机APP 远程连接测试)
3-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案数据篇(安装配置数据库,使用Navicat for MySQL和手机APP 连接测试) 根据前面的教程把软件复制到云 ...
- adaboost-笔记(1)
1 - 加法模型 加法模型,就是通过训练集不断的得到不同的分类器(回归),然后将这些分类器组合成一个新的分类器的过程. 假设有\(N\)个样本,且我们的加法模型如下: \[f(x)=\sum_{m=1 ...
- Eclipse 设置保存代码时自动格式化
在码代码或者优化的时候,经常需要使用到ctrl+shift+F来格式化代码,但其实ecilpse已经自带自动格式化功能了,只是没有默认开启. 正确的打开方式:windows-->Preferen ...
- 在Bootstrap开发中解决Tab标签页切换图表显示问题
在做响应式页面的时候,往往需要考虑更多尺寸设备的界面兼容性,一般不能写死像素,以便能够使得界面元素能够根据设备的不同进行动态调整,但往往有时候还是碰到一些问题,如Tab标签第一页面正常显示,但是切换其 ...
- Grafana+Telegraf+Influxdb监控Tomcat集群方案
前言 前一段时间自家养的几只猫经常出问题,由于没有有效的监控预警手段,以至于问题出现或者许久一段时间才会被通知到.凌晨一点这个锅可谁都不想背,为此基于目前的情况搭建了以下这么一套监控预警系统. 相关软 ...
- SkyWalking Liunx 环境搭建&NetCore接入
背景 前两天看见有小哥介绍windows下安装skywalking的介绍地址在这. 正好最近也在搭建linux环境的SkyWalking,顺便把linux环境搭建的经验分享下,帮助下使用linux部署 ...
- Linux Namespace : Network
Network namespace 在逻辑上是网络堆栈的一个副本,它有自己的路由.防火墙规则和网络设备.默认情况下,子进程继承其父进程的 network namespace.也就是说,如果不显式创建新 ...
- Raspberry Zero 上实现平滑视频图传
在某些应用场合我们可能需要通过一个设备通过WIFI将图像传到其它的机器进行显示或者图形分析,那怎么可以低成本地实现呢?其实很简单,我们只需要一块 Raspberry Zero W 和一个RPI 摄像头 ...