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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:27:03