Laravel 模型属于关系加载问题

Laravel model belongs to relationship loading issue

我有两个模型,Box 和 BoxLocations。 BoxBoxLocationshasMany 关系,BoxLocationsBoxbelongsTo 关系。

BoxLocations 也有一个附加到模型的属性,该属性需要来自 Box 关系的一条信息。

我注意到在调用 Box::with(['BoxLocations']->)all(); 时我看到 BoxLocations 模型正在重新加载 Box 关系。每个 BoxLocation(50 奇数次)

都会发生这种情况

laravel 是否跟踪 Box 是否已从初始 Box::with(['BoxLocations']->)all(); 请求加载,然后将其传递给 BelongsTo 关系?

我正在尝试优化 Web 系统,当加载 taken 属性时(令人恼火的是,每次加载时都需要它),它会导致数据库对已加载的相同 Box 模型进行 50 次奇怪的点击。

如果 laravel 不这样做 - 是否有更好的方法来实现上述目标?

Laravel 在使用 with() 方法时使用 eager loading

When accessing Eloquent relationships as properties, the relationship data is "lazy loaded". This means the relationship data is not actually loaded until you first access the property. However, Eloquent can "eager load" relationships at the time you query the parent model. Eager loading alleviates the N + 1 query problem.

所以如果你这样做:

$boxes = Box::with('BoxLocations')->get();

它会加载关系,但假设您这样做:

$boxes = Box::all();

foreach($boxes as $box)
{
  echo box->boxlocation->name;
}

如果您有 50 个 Box,此循环将 运行 51 个查询。

但是当您使用 with 方法并预先加载关系时,此循环将 运行 只有 2 个查询。

您也可以使用 Lazy Eager Loading 并决定何时加载关系