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
相关产品推荐
相关产品推荐

