Laravel多表关联带pivot中间表如何从Product模型获取关联option_groups
实现方案
首先需要先在Option模型中定义与OptionGroup的从属关联,作为基础依赖:
// App/Models/Option.php public function optionGroup() { return $this->belongsTo(\App\Models\OptionGroup::class); }
方案1:定义原生关联(支持预加载、关联查询)
该方案适合需要用关联做筛选、预加载的复杂场景,性能更优,在Product模型中添加如下方法即可:
// App/Models/Product.php public function optionGroups() { return $this->belongsToMany(\App\Models\OptionGroup::class, 'option_products', 'product_id', 'option_id') ->join('options', 'option_products.option_id', '=', 'options.id') ->join('option_groups', 'options.option_group_id', '=', 'option_groups.id') ->select('option_groups.*') ->distinct(); }
你可以直接通过$product->optionGroups获取关联数据,也支持预加载调用:Product::with('optionGroups')->get()。
方案2:访问器实现(只读场景更简便)
如果仅需要读取关联的选项组数据,不需要做关联增删改/查询筛选,可以直接复用已有的options关联实现,代码更简洁:
// App/Models/Product.php public function getOptionGroupsAttribute() { return $this->options->map->optionGroup->unique('id'); }
调用方式和方案1一致:$product->option_groups即可获取去重后的选项组集合。
内容的提问来源于stack exchange,提问作者Yakoubit
相关产品推荐
相关产品推荐

