Laravel 8运行Seeder报Property [id]不存在于集合实例错误如何解决
问题根源
调用\App\Models\User::factory()->count(30)->create()时,返回结果是包含30个用户模型的Illuminate\Database\Eloquent\Collection集合实例,并非单个用户对象,直接访问$user->id会因为集合不存在该属性触发报错。
解决方案
根据你的实际需求选择对应修改方案:
方案1:所有课程归属同一个测试用户
如果不需要多用户关联,直接将创建30个用户的逻辑改为创建单个用户即可:
public function run() { // 创建单个用户,返回单例模型可直接访问id属性 $user = \App\Models\User::factory()->create(); \App\Models\Course::factory()->count(5)->create(['user_id' => $user->id ])->each(function ($course) { \App\Models\Episode::factory()->count( rand(6 , 20))->make()->each(function ($episode , $key) use ($course){ $episode->number = $key +1; $course->episodes()->save($episode); }); }); }
方案2:保留30个用户,课程随机关联用户
如果确实需要生成30个测试用户,从用户集合中随机取一个用户的id赋值即可:
public function run() { $users = \App\Models\User::factory()->count(30)->create(); // 从30个用户里随机取一个的id绑定到课程 \App\Models\Course::factory()->count(5)->create(['user_id' => $users->random()->id ])->each(function ($course) { \App\Models\Episode::factory()->count( rand(6 , 20))->make()->each(function ($episode , $key) use ($course){ $episode->number = $key +1; $course->episodes()->save($episode); }); }); }
注意:修改前请确认Course模型的
$fillable属性中已包含user_id字段,避免触发批量赋值屏蔽错误。
内容的提问来源于stack exchange,提问作者xabise
相关产品推荐
相关产品推荐

