Laravel中如何通过多模型获取层级关联数据?
正确的层级关联查询实现方案
问题分析
你的查询错误在于直接尝试给FoodSection加载foodItem和alergen关联,但这两个关联并不直接属于FoodSection,而是嵌套在foodCategory之下的层级关联,需要使用嵌套预加载语法来实现完整层级的关联数据获取。
正确的查询语句
使用Laravel的点式嵌套预加载语法,就能一次性获取包含完整层级结构的$menu对象:
$menu = FoodSection::withTrashed() ->with('foodCategory.foodItem.alergen') ->get();
这个语句会按以下层级加载数据:
- 所有包含软删除的
FoodSection - 每个
FoodSection对应的全部FoodCategory - 每个
FoodCategory对应的全部FoodItem - 每个
FoodItem对应的全部Alergen
模型关联修正提示
注意到你的Alergen模型中,foodItem关联定义为belongsToMany,但FoodItem中对应的关联是hasMany(Alergen::class),二者不匹配:
- 如果是一对多关系(一个
FoodItem对应多个Alergen),需将Alergen的关联改为:
public function foodItem() { return $this->belongsTo(FoodItem::class); }
- 如果是多对多关系,需将
FoodItem的关联改为belongsToMany(Alergen::class),同时创建中间表alergen_food_item。
请根据实际业务逻辑修正关联定义,否则预加载alergen会出现数据错误。
内容的提问来源于stack exchange,提问作者Janjac
相关产品推荐
相关产品推荐

