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

如何在Laravel JSON API中展示关联数据

解决Laravel API返回关联模型字段的问题

这问题我之前也碰到过,Laravel里要把user_id替换成关联的user对象返回,其实主要靠Eloquent关联和API资源来实现,给你两种常用的方案:

第一步:确保模型关联正确

首先得确认你的主模型(比如你这个是评论/评分模型,假设叫Review)和User模型之间的关联已经定义好:

// app/Models/Review.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Review extends Model
{
    // ... 其他模型代码

    public function user(): BelongsTo
    {
        // 关联User模型,默认用user_id作为外键
        return $this->belongsTo(User::class);
    }
}

方案一:直接用Eloquent预加载+字段筛选

如果只是简单需求,不想写资源类,可以直接在控制器里用with()预加载关联,同时限制返回的User字段(避免返回多余数据):

// 比如在你的API控制器方法里
use App\Models\Review;
use Illuminate\Http\Response;

public function show($id)
{
    // 预加载user关联,同时只选择需要的字段(必须包含id,因为Laravel靠它关联)
    $review = Review::with(['user' => function ($query) {
        $query->select('id', 'name', 'surname', 'avatar');
    }])->findOrFail($id);

    return response()->json($review);
}

如果想去掉返回结果里的user_id字段,可以在Review模型里添加隐藏字段配置:

// 在Review模型里添加
protected $hidden = ['user_id'];

或者也可以手动构建返回数组,精准控制字段:

return response()->json([
    'content' => $review->content,
    'created_at' => $review->created_at,
    'deleted_at' => $review->deleted_at,
    'group_id' => $review->group_id,
    'rating' => $review->rating,
    'updated_at' => $review->updated_at,
    'user' => $review->user->only(['name', 'surname', 'avatar'])
]);

方案二:用API资源类(推荐,适合复杂场景)

如果你的API返回结构比较复杂,或者以后可能需要修改,用Laravel的API资源类会更优雅,复用性更强。

1. 创建资源类

首先生成Review和User的资源类:

# 生成单个资源
php artisan make:resource ReviewResource
php artisan make:resource UserResource

2. 配置UserResource

编辑app/Http/Resources/UserResource.php,定义User需要返回的字段:

namespace App\Http\Resources;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

class UserResource extends JsonResource
{
    public function toArray(Request $request): array
    {
        return [
            'name' => $this->name,
            'surname' => $this->surname,
            'avatar' => $this->avatar,
        ];
    }
}

3. 配置ReviewResource

编辑app/Http/Resources/ReviewResource.php,关联UserResource:

namespace App\Http\Resources;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

class ReviewResource extends JsonResource
{
    public function toArray(Request $request): array
    {
        return [
            'content' => $this->content,
            'created_at' => $this->created_at,
            'deleted_at' => $this->deleted_at,
            'group_id' => $this->group_id,
            'rating' => $this->rating,
            'updated_at' => $this->updated_at,
            'user' => new UserResource($this->user),
        ];
    }
}

4. 在控制器中返回资源

use App\Models\Review;
use App\Http\Resources\ReviewResource;

public function show($id)
{
    // 记得预加载user关联,避免N+1查询问题
    $review = Review::with('user')->findOrFail($id);

    return new ReviewResource($review);
    // 如果是返回集合,用:return ReviewResource::collection($reviews);
}

注意事项

  • 一定要用with('user')预加载关联,否则会产生N+1查询问题(每查询一条Review就额外查一次User),影响性能。
  • 如果你的模型不是Review,把上面的模型名换成你实际的模型名称即可。

内容的提问来源于stack exchange,提问作者szczepaniakdominik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:02:50