Laravel中如何通过两个中间表筛选匹配用户饮食方案的食谱?
解决方案
首先需要在Recette模型中补充与Regime的多对多关联(你之前仅配置了User和Regime的关联):
// Recette.php public function regimes() { return $this->belongsToMany(Regime::class); }
接下来有两种高效的实现方式:
方式一:数据库层面筛选(推荐,性能更优)
通过whereHas方法直接在数据库中过滤出关联当前用户饮食方案的食谱:
// 在控制器的食谱列表方法中 $matchingRecettes = Recette::whereHas('regimes', function ($query) { // 关联当前用户的所有饮食方案ID $query->whereIn('regime_id', auth()->user()->regimes()->select('id')); })->get();
或者拆分步骤,逻辑更直观:
// 获取当前用户关联的所有饮食方案ID集合 $userRegimeIds = auth()->user()->regimes()->pluck('id'); // 筛选关联这些饮食方案的食谱 $matchingRecettes = Recette::whereHas('regimes', function ($query) use ($userRegimeIds) { $query->whereIn('regime_id', $userRegimeIds); })->get();
方式二:集合层面处理(适合小数据场景)
先加载用户的饮食方案及其关联的食谱,再通过集合操作去重得到结果:
$matchingRecettes = auth()->user() ->regimes() ->with('recettes') // 预加载关联的食谱,避免N+1查询 ->get() ->pluck('recettes') // 提取所有食谱集合 ->flatten() // 将多维集合转为一维 ->unique('id'); // 去重,避免同一个食谱多次出现
补充说明
- 若需要反向查询(从饮食方案找对应食谱),建议在
Regime模型中补充关联:
// Regime.php public function recettes() { return $this->belongsToMany(Recette::class); }
- 如需分页展示,只需将
get()替换为paginate($perPage)即可。
内容的提问来源于stack exchange,提问作者Karl
相关产品推荐
相关产品推荐

