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
相关产品推荐
相关产品推荐

