Laravel如何通过slug动态获取文章ID并加载对应关联文章块
解决方案
步骤1:配置模型关联
首先在Article模型中定义和ArticleBlock的一对多关联:
// app/Models/Article.php public function blocks() { // 外键article_id如果符合命名规范,第二个参数可以省略 return $this->hasMany(ArticleBlock::class, 'article_id'); }
步骤2:修改控制器逻辑
两种实现方式均可替换硬编码写法:
方式1:直接用当前文章ID查询
先修正文章查询逻辑,增加不存在时返回404的判断,再用查到的文章ID关联查询文章块:
public function index(Request $request, $slug) { // 改用firstOrFail,slug不匹配时直接返回404,避免后续调用属性报错 $article = Article::where('slug', $slug)->firstOrFail(); // 替换硬编码的1,使用当前文章的ID作为查询条件 $article_blocks = ArticleBlock::where('article_id', $article->id)->get(); return view('article', compact('article', 'article_blocks')); }
方式2:关联预加载(更推荐,性能更优)
查询文章时直接预加载关联的文章块,减少数据库查询次数:
public function index(Request $request, $slug) { // with方法预加载blocks关联,一次查询拿到文章+对应所有文章块 $article = Article::with('blocks')->where('slug', $slug)->firstOrFail(); // 直接从关联属性获取文章块即可 $article_blocks = $article->blocks; return view('article', compact('article', 'article_blocks')); }
补充说明
原有Blade模板不需要做任何修改,可正常遍历$article_blocks渲染内容。
内容的提问来源于stack exchange,提问作者user16978178
相关产品推荐
相关产品推荐

