You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 9中如何实现第二层关联翻译的延迟加载

解决Laravel 9中astrotomic/laravel-translatable第二层关联翻译N+1查询问题

针对第二层关联(如hasMany)的翻译出现N+1查询的问题,可通过以下几种方案解决:

1. 嵌套预加载关联翻译

在查询根模型时,直接通过嵌套预加载的方式,一次性加载所有层级的关联及对应翻译,避免逐个实体发起查询。示例代码:

$events = Event::with([
    'translations',
    'childEntity.translations' // 嵌套预加载子实体的翻译
])->get();

这种方式会生成批量查询,一次性获取所有事件、事件翻译、子实体及子实体翻译,彻底消除N+1问题。

2. 定义带翻译的关联方法

在根模型中自定义包含翻译预加载的关联方法,后续查询时直接调用该关联即可。示例:
在Event模型中添加:

public function childEntityWithTranslations()
{
    return $this->hasMany(ChildEntity::class)->with('translations');
}

查询时使用这个关联:

$events = Event::with('translations', 'childEntityWithTranslations')->get();

这种方式可以将关联与翻译预加载逻辑封装在一起,提升代码复用性。

3. 设置模型默认预加载翻译

如果子实体的翻译在所有业务场景中都需要加载,可以在子实体模型中设置默认预加载:
在ChildEntity模型中添加:

protected $with = ['translations'];

这样每次查询ChildEntity时都会自动加载其翻译,无需手动指定预加载。但需注意,该设置会作用于所有ChildEntity的查询,若存在不需要翻译的场景,可能会造成不必要的性能损耗。

内容的提问来源于stack exchange,提问作者Čamo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 06:23:15