Laravel渴求式加载(比较容易理解理解load与with关系)

Laravel渴求式加载(比较容易理解理解load与with关系)

渴求式加载

当以属性方式访问 Eloquent关联关系的时候,关联关系数据是「懒惰式加载」的,这意味着关联关系数据直到第一次访问的时候才被加载。不过,Eloquent 还可以在查询父级模型的同时「渴求式加载」关联关系。渴求式加载缓解 N+1 查询问题,要阐明 N+1 查询问题,查看关联到 Auth的 Book模型:

Laravel学院文档: https://laravelacademy.org/post/9584.html

根据官方文档, 创建两个表,不多说.
Laravel渴求式加载(比较容易理解理解load与with关系)
新建两个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语句
Laravel渴求式加载(比较容易理解理解load与with关系)

这里发现 其实这里是执行了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 变成了两条
Laravel渴求式加载(比较容易理解理解load与with关系)

Laravel渴求式加载(比较容易理解理解load与with关系)

渴求式加载多个关联关系

有时候你需要在单个操作中渴求式加载多个不同的关联关系。要实现这个功能,只需要添加额外的参数到with方法即可:

在这里,我又新建了一个category表
Laravel渴求式加载(比较容易理解理解load与with关系)
在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表中的数据也查出来了
Laravel渴求式加载(比较容易理解理解load与with关系)
嵌套的渴求式加载

要渴求式加载嵌套的关联关系,可以使用”.“语法。例如,我们在一个 Eloquent 语句中渴求式加载所有书的作者及所有作者的个人联系方式:
$books = Book::with(‘auth.contact’)->get();

这里还需要新建一个contact表,存放作者的联系方式
Laravel渴求式加载(比较容易理解理解load与with关系)
然后新建一个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表的信息也查出来了.
Laravel渴求式加载(比较容易理解理解load与with关系)
渴求式加载指定字段

并不是每次获取关联关系时都需要所有字段,因此,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两个字段了 其他多余的字段都没有了

Laravel渴求式加载(比较容易理解理解load与with关系)
带条件约束的渴求式加载

有时候我们希望渴求式加载一个关联关系,但还想为渴求式加载指定更多的查询条件:

$books = Book::with(['auth' => function ($query) {
    //约束条件
    $query->where('name', 'like', '吴%');
}])->get();
dd($books);

查看页面输出信息,只有auth表中name字段以吴开头的信息查出来了,其他的都没查出来
Laravel渴求式加载(比较容易理解理解load与with关系)
在这个例子中,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');

Laravel渴求式加载(比较容易理解理解load与with关系)
去掉loadMissing之后…下面那行sql语句变了,但是感觉没啥用啊.不知道这个东西有什么用.
Laravel渴求式加载(比较容易理解理解load与with关系)Laravel渴求式加载(比较容易理解理解load与with关系)

 

原文:https://blog.csdn.net/u013032345/article/details/82772938

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112397.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 为何你会被强插广告/盗号?谈HTTPS连接的那些事

    为何你会被强插广告/盗号?谈HTTPS连接的那些事相信很多朋友都遇到过网页被强插广告的情况,好端端一个干净的页面,动不动就被插了个屠龙宝刀点击就送的小窗口,看着就心烦。这种网页劫持强插广告的现象,在中国非常常见,往往是运营商进行HTTP劫持所造成的。对付这种劫持,一个很好的解决办法就是HTTPS。网页劫持很多人都有遇到过,HTTPS可以比较好地防范这问题HTTPS能够加密网页传输内容,不仅可以防…

    2022年7月15日
    17
  • 463个生活小窍门

    463个生活小窍门1、巧用牙膏6:若有小面积皮肤损伤或烧伤、烫伤,抹上少许牙膏,可立即止血止痛,也可防止感染,疗效颇佳。2、巧除纱窗油腻3:可将洗衣粉、吸烟剩下的烟头一起放在水里,待溶解后,拿来擦玻璃窗、纱窗,效果均不错。3、将虾仁放入碗内,加一点精盐、食用碱粉,用手抓搓一会儿后用清水浸泡,然后再用清水洗净,这样能使炒出的虾仁透明如水晶,爽嫩可口。4、和饺子面的窍门1:在1斤面粉里掺入6个蛋清,使面里蛋白质增加,包的饺子下锅后蛋白质会很快凝固收缩,饺子起锅后收水快,不易粘连5、将残茶叶浸入水中数天后,浇在植

    2022年6月23日
    20
  • 电商后台管理系统前端开发总结[通俗易懂]

    电商后台管理系统前端开发总结[通俗易懂]前端和服务器存在跨域问题使用token维持状态,否则使用cookie或者session记录状态

    2022年5月18日
    50
  • Java定时器(Timer)「建议收藏」

    Java定时器(Timer)「建议收藏」1.介绍Timer和TimerTask是用于在后台线程中调度任务的javautil类。简单地说,TimerTask是要执行的任务,Timer是调度器。2.调度一次性任务2.1指定延迟后执行让我们从简单地在定时器的帮助下运行单个任务开始:@TestpublicvoidgivenUsingTimer_whenSchedulingTaskOnce_thenCorrect(){TimerTasktask=newTimerTask(){publicvoid

    2022年7月7日
    25
  • 代理服务器与反向代理服务器的区别「建议收藏」

    代理服务器与反向代理服务器的区别「建议收藏」代理服务器与反向代理服务器

    2022年5月6日
    42
  • java中%c%n是什么意思_在编码时如何使用\r与\n,两者的区别

    java中%c%n是什么意思_在编码时如何使用\r与\n,两者的区别\r与\n到底有何区别,编码的时候又应该如何使用,我们下面来了解一下。区别:\r:全称:carriagereturn(carriage是“字车”的意思,打印机上的一个部件)简称:return缩写:rASCII码:13作用:把光标移动到当前行的最左边\n:全称:newline别名:linefeed缩写:nASCII码:10作用:把光标向下移动一行不同操作系统怎样表示“回车+换行”(即一行的结…

    2022年7月8日
    30

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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