$query->with() 正在工作,但 $query->load() 在 Laravel 中不起作用



我有三个模型。

  1. 部分
  2. 主题
  3. 第章

章节有很多主题,主题有很多章节。我想加载一个包含所有主题的部分,以及包含所有章节的主题。这是我正在尝试的代码:

$section = Section::find(1)->load(['subjects' => function ($query) {
$query->load('chapters');
}]);

这不起作用。$query->load('chapters')这部分给了我错误。但如果我尝试这个代码:

$section = Section::find(1)->load(['subjects' => function ($query) {
$query->with('chapters');
}]);

这是有效的。我对$query->with()有一些问题,所以我想改用$query->load()。使用load()而不是with()>

Eloquent Query构建器没有名为load()的函数。但Eloquent Model确实如此。

$section = Section::find(1)
->load(['subjects' => function ($query) { // in here you are calling load on a model (Section).
$query->load('chapters'); // in here you are calling load on a query builder instance.
}]);
  • 当您想在获取模型后加载一些关系时,请使用load()函数
  • 当您想在获取模型时加载一些关系时,请使用with()函数

在您的情况下,您已经提取了主题。所以您可以使用load('subject')。但是当你加载主题时(你还没有提取主题(,所以你应该调用with('chapters')

编辑第二种方法的简短版本

$section = Section::find(1)->load(['subjects.chapters');

如果没有单独获取章节的特殊要求,更好的方法是在获取章节的同时加载主题和章节。

$section = Section::with('subjects.chapters')->find(1)

为什么不使用:

$section = Section::query()->with('subjects.chapters')->find(1)

这将预加载主题与章节,并给你一个快速的结果。

最新更新