Laravel8 Eloquent查询添加子查询字段获取关联表图片列表
解决方案
你原来的leftJoin写法会产生笛卡尔积,每个匹配的图片都会对应一条用户记录,无法直接聚合为数组格式,按照下面步骤修改即可:
步骤1:定义User模型的关联关系
在app/Models/User.php中添加一对多关联方法,关联Images表:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class User extends Model { // 原有其他配置、方法... public function images() { return $this->hasMany(Image::class, 'id_user', 'id'); } }
注意:提前确保你已经创建了Image模型对应Images表,如果还没创建可以先执行php artisan make:model Image生成。
步骤2:修改控制器查询代码
用Eloquent的预加载with()方法加载关联数据,避免N+1查询问题:
public function index(Request $request) { $users = User::where('active', 1) ->with('images') ->paginate(10); return UserResource::collection($users); }
步骤3:调整UserResource返回格式
在app/Http/Resources/UserResource.php中处理images字段,提取所有图片路径为数组:
public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, 'images' => $this->images->pluck('image')->toArray() ]; }
方案说明
Eloquent的关联预加载会先查询所有符合条件的用户,再批量查询对应用户的所有图片,最后自动把图片数据挂载到对应用户的images属性上,只需要在资源层做简单的字段提取就能得到你要求的返回结构。
内容的提问来源于stack exchange,提问作者Ezequiel Tavares
相关产品推荐
相关产品推荐

