Laravel保存页面后返回关联分类名称而非category_id的实现方法
Laravel 模型关联+返回分类名实现方案
第一步:编写两个模型的关联关系
- Page(页面/文章)模型:单个页面归属于一个分类,使用
belongsTo关联
打开app/Models/Page.php,添加如下方法:public function category() { // 外键是category_id,符合框架默认约定,第二个参数可省略 return $this->belongsTo(Category::class); } - Category(分类)模型:单个分类下包含多个页面,使用
hasMany关联
打开app/Models/Category.php,添加如下方法:public function pages() { return $this->hasMany(Page::class); }
关联定义默认约定:主模型主键为
id,关联表外键为主模型名小写_id,你的表结构用的category_id刚好符合约定,不需要额外传参指定外键。
第二步:修改store方法,返回带分类名的数据
保存Page模型后,使用load()方法延迟加载关联的分类数据,返回的JSON就会携带分类信息。另外注意你原代码校验了image字段但没写上传存储逻辑,补全后完整代码如下:
public function store(Request $request) { $request->validate([ 'title' => 'required|max:255', 'image' => 'required|mimes:jpg,jpeg,png|max:8192', 'language' => 'required' ]); $page = new Page; $page->title = $request->title; $page->slug = $request->slug; $page->content = $request->contents; $page->category_id = $request->cat_id; $page->language = $request->language; // 补全图片上传存储逻辑 if ($request->hasFile('image')) { $page->image = $request->file('image')->store('page-images', 'public'); } $page->save(); // 加载关联分类数据,只查询id和name字段减少冗余,不需要字段筛选可以去掉:id,name $page->load('category:id,name'); // 如果不想嵌套category结构,只想平级返回category_name,可以加下面两行 // $page->category_name = $page->category->name; // $page->makeHidden('category'); return response()->json([ 'data' => $page, 'success' => 'File uploaded successfully.' ]); }
返回效果说明
默认返回的data结构中会包含嵌套的category对象,可直接取分类名:
{ "data": { "id": 1, "title": "xxx", "category_id": 2, "category": { "id": 2, "name": "分类名称" } }, "success": "File uploaded successfully." }
内容的提问来源于stack exchange,提问作者Rapunzel
相关产品推荐
相关产品推荐

