我已经查看了laravel文档,我在查询中 With 或加载之间没有区别,在哪种情况下我们需要使用With或Load?请描述一下
Model::find(1)->with('firstModel','SecondModel');
Model::find(1)->load('firstModel','SecondModel');
答案 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问题。
您可以查看此文章以获取有关此内容的更多信息。
答案 1 :(得分:1)
在坚果壳中,with()
同时加载与父模型的关系。那是急切的负担。
如果您不想急于加载该数据,则可以使用延迟加载或急切延迟加载。在这种情况下,当您真正开始使用关系时,将加载数据。因此,您可以在运行时决定要加载的确切关系,或者您可能根本不想加载任何关系数据等。
答案 2 :(得分:1)
with()
同时加载父模型。
load()
。例如,如果您需要动态决定是否加载相关模型,这可能很有用:
$books = App\Book::all();
if ($someCondition) {
$books->load('author', 'publisher');
}
如果需要在预先加载的查询上设置其他查询约束,可以将Closure传递给load方法:
$books->load(['author' => function ($query) {
$query->orderBy('published_date', 'asc');
}]);