zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    在DNN模块开发中使用jQuery
    在MSBuild.exe中使用条件编译(Conditional Compile)
    ASP.NET SQL 注入免费解决方案
    html+css做圆角表格
    [ASP]sitemap地图生成代码
    刺穿MYIE|24小时同一ip弹一次|无须body加载|精简代码
    用ASPJPEG组件制作图片的缩略图和加水印
    16个经典面试问题回答思路[求职者必看]
    一个26岁IT男人写在辞职后
    搜弧IT频道的幻灯片切换的特效源代码
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15453442.html
Copyright © 2011-2022 走看看