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

Laravel API Resource优化:如何高效获取创建/更新者用户名

实现方案

要高效实现返回用户名而非ID的需求,分以下几步操作:

1. 在模型中定义关联关系

假设你的Resource对应Blog模型,先在模型里创建与User模型的关联,指定外键:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Models\User;

class Blog extends Model
{
    // 关联创建者用户
    public function createdBy()
    {
        return $this->belongsTo(User::class, 'created_by_id');
    }

    // 关联更新者用户
    public function updatedBy()
    {
        return $this->belongsTo(User::class, 'updated_by_id');
    }
}

2. 修改API Resource返回字段

把原来的ID字段替换为关联用户的用户名,使用PHP 8+的空安全运算符?->简化空值处理:

public function toArray($request)
{
    return [
        'id' => $this->id,
        'created_by' => $this->createdBy?->name ?? 'N/A',
        'updated_by' => $this->updatedBy?->name ?? 'N/A',
        'blog_category_id' => $this->blog_category_id ?? 'N/A',
        'title' => $this->title,
        'status' => $this->status,
        'image' => $this->image,
        'desc' => $this->desc,
    ];
}

3. 预加载关联避免N+1查询

这是保证性能的关键!在控制器查询数据时,通过with()方法预加载createdBy和updatedBy关联,减少数据库查询次数:

// 获取单条博客数据
$blog = Blog::with(['createdBy', 'updatedBy'])->findOrFail($id);

// 获取博客列表(分页)
$blogs = Blog::with(['createdBy', 'updatedBy'])->paginate();

补充说明

  • 空安全运算符?->会自动判断关联是否存在,避免调用不存在的关联属性引发错误;
  • 预加载是高效的核心:如果不预加载,每查询一条博客就会额外执行两次用户查询,数据量越大性能越差,预加载能把所有关联查询合并为2次(一次查所有创建者,一次查所有更新者);
  • 如果你的User模型中存储用户名的字段不是name,替换成实际字段名即可。

内容的提问来源于stack exchange,提问作者Nymul Islam Moon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:02:10