laravel中“with”和“load”之间有什么不同

时间:2016-06-13 05:51:25

标签: php laravel

我已经查看了laravel文档,我在查询中 With 加载之间没有区别,在哪种情况下我们需要使用With或Load?请描述一下

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

急切加载关系。

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

懒惰的急切加载。它将关系加载到您已检索的现有Model实例。 (当find(1)返回一个Model实例时,load告诉它然后加载指定的关系) 还可以在集合上使用load来加载包含的所有Model实例的关系。当处理一组模型与单个模型相比时,load更有用,因为仅使用动态属性(延迟加载,如果尚未加载),模型上的关系将导致运行相同的查询。在集合上,它会在迭代它时删除任何N + 1问题。

您可以查看此文章以获取有关此内容的更多信息。

asklagbox - blog - Eloquent Querying Relations

答案 1 :(得分:1)

在坚果壳中,with()同时加载与父模型的关系。那是急切的负担。

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

答案 2 :(得分:1)

with()同时加载父模型。

需要Lazy Eager Loading时使用

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

$books = App\Book::all();

if ($someCondition) {
    $books->load('author', 'publisher');
}

如果需要在预先加载的查询上设置其他查询约束,可以将Closure传递给load方法:

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