Laravel同模型多对多关联数据如何在blade页面正确展示
你现在的代码存在3个核心错误:
- 模型中
articles关联的中间表参数配置错误,误填为了主表articles - 控制器查询逻辑错误,
with()闭包仅筛选预加载的关联数据,不会限制主表返回结果,所以会拿到所有文章数据 - 视图遍历对象错误,你遍历的是主文章集合,不是关联的推荐文章数据
1. 修正模型关联代码
因为是同模型自关联多对多,两个关联方法分别对应正向(当前文章的推荐文章)、反向(哪些文章把当前文章设为推荐),外键顺序要对应调整:
// 反向关联:哪些文章将当前文章设为推荐 public function articles() { return $this->belongsToMany('App\Models\Article', 'article_recommendations' , 'article_recommended_id' , 'article_id'); } // 正向关联:当前文章的推荐文章列表 public function article_recommendations() { return $this->belongsToMany('App\Models\Article', 'article_recommendations' , 'article_id' , 'article_recommended_id'); }
2. 修正控制器查询代码
如果你需要获取id为1的文章对应的推荐文章,直接查询该文章后获取关联数据即可:
// 先找到id为1的主文章,同时预加载关联推荐文章避免N+1问题 $article = Article::with('article_recommendations')->find(1); // 取出推荐文章集合传给视图 $recommendations = $article->article_recommendations; return view('你的视图名', compact('recommendations'));
如果你需要筛选「至少有1条关联推荐数据、且关联的主文章id为1」的所有推荐文章,也可以用whereHas写法:
$recommendations = Article::whereHas('articles', function($query) { $query->where('article_id', 1); })->get();
3. 修正Blade视图遍历代码
直接遍历推荐文章集合即可:
@foreach($recommendations as $recommend) {{ $recommend->title }} @endforeach
内容的提问来源于stack exchange,提问作者user16978178
相关产品推荐
相关产品推荐

