【问题标题】:what is the different between "with" and "load" in laravellaravel 中的“with”和“load”有什么区别
【发布时间】:2016-10-13 10:49:20
【问题描述】:

我已经浏览了 laravel 文档,我没有得到查询中 WithLoad 之间的区别,在什么情况下我们需要使用 With 或 Load?请描述一下

Model::find(1)->with('firstModel','SecondModel');

Model::find(1)->load('firstModel','SecondModel');

【问题讨论】:

标签: php laravel


【解决方案1】:
Model::find(1)->with('firstModel','SecondModel');

实际上并没有做任何事情,因为with 现在是一个新的构建器,它与从find(1) 返回的模型无关。

Model::with(....)->find(1);

渴望加载关系。

Model::find(1)->load(...);

是延迟加载。它将关系加载到您已经检索到的现有模型实例。 (find(1) 返回一个 Model 实例,load 告诉它然后加载指定的关系) load 也可用于 Collections 以加载包含的所有模型实例上的关系。 load 在处理一组模型时比处理单个模型更有用,因为仅对模型上的关系使用动态属性(延迟加载,如果尚未加载)会导致运行相同的查询。在一个集合上,它会在遍历它们时消除任何 N+1 问题。

您可以查看这篇文章了解更多信息。

asklagbox - blog - Eloquent Querying Relations

【讨论】:

    【解决方案2】:

    简而言之,with() 同时加载与父模型的关系。这是急切的负载。

    如果您不想急切加载该数据,可以使用延迟加载或急切延迟加载。在这种情况下,数据将在您实际开始使用关系时加载。因此,您可以在运行时决定要加载的确切关系,或者您可能根本不想加载任何关系数据等。

    【讨论】:

      【解决方案3】:

      with() 与父模型同时加载。

      load() 在您需要Lazy Eager Loading 时使用。例如,如果您需要动态决定是否加载相关模型,这可能很有用:

      $books = App\Book::all();
      
      if ($someCondition) {
          $books->load('author', 'publisher');
      }
      

      如果您需要在预加载查询上设置额外的查询约束,您可以将一个闭包传递给 load 方法:

      $books->load(['author' => function ($query) {
          $query->orderBy('published_date', 'asc');
      }]);
      

      【讨论】:

        猜你喜欢
        • 2015-04-12
        • 2014-08-05
        • 1970-01-01
        • 2021-12-05
        • 2011-07-08
        • 2010-11-29
        • 2018-03-26
        • 2017-09-07
        相关资源
        最近更新 更多