Laravel 8中withCount仅返回ID,无法获取用户任务关联计数
Laravel 8 Eloquent关联计数不显示的问题排查
问题场景
使用Laravel 8的Eloquent查询构建器,想要统计每个用户被分配的任务数量,但关联任务计数未正常显示。
数据库结构及示例数据
create table user_tasks ( id integer primary key, user_id integer not null ); create table users ( id integer primary key, name text not null ); insert into user_tasks values (1, 1); insert into user_tasks values (2, 2); insert into user_tasks values (3, 1); insert into user_tasks values (4, 1); insert into user_tasks values (5, 1); insert into user_tasks values (6, 2); insert into users values (1, 'joe'); insert into users values (2, 'sally'); insert into users values (3, 'bob');
期望输出
1, 'joe', 4 2, 'sally', 2 3, 'bob', 0
现有代码
class User extends Model { public function getTaskCount() { return $this->hasMany('App\Models\User\Task', 'user_id'); } } $result = User::select(['id']) ->withCount('getTaskCount') ->get();
实际输出
[ { "id": 1 }, { "id": 2 }, { "id": 3 } ]
问题原因及解决方法
1. 关联方法命名不符合Eloquent规范
Eloquent关联方法需使用驼峰式命名(不含get前缀),getTaskCount的命名会导致withCount无法正确识别关联关系。
修正关联方法:
class User extends Model { // 改为符合规范的命名 public function tasks() { return $this->hasMany('App\Models\User\Task', 'user_id'); } }
2. select未包含所需字段
当前仅选择id字段,结果自然不会包含name和计数字段。需添加name字段到select中,withCount生成的计数字段默认格式为{关联名}_count,此处对应tasks_count。
修正查询代码:
$result = User::select(['id', 'name']) ->withCount('tasks') ->get();
3. 模型与数据表的映射问题
关联模型App\Models\User\Task默认对应的数据表是tasks,但你的表名为user_tasks,需在Task模型中指定表名:
class Task extends Model { protected $table = 'user_tasks'; }
最终输出效果
修正后查询结果会包含预期字段:
[ { "id": 1, "name": "joe", "tasks_count": 4 }, { "id": 2, "name": "sally", "tasks_count": 2 }, { "id": 3, "name": "bob", "tasks_count": 0 } ]
内容的提问来源于stack exchange,提问作者Darren Gates
相关产品推荐
相关产品推荐

