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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:10:38