Laravel 8 Seeders:此集合实例上不存在属性 [id]

Posted

技术标签:

【中文标题】Laravel 8 Seeders:此集合实例上不存在属性 [id]【英文标题】:Laravel 8 Seeders: Property [id] does not exist on this collection instance 【发布时间】:2021-11-14 07:19:39 【问题描述】:

我想为表 userscourses 和 `episodes 运行播种器。

这里是UserFactory

public function definition()
    
        static $password;
        return [
            'name' => $this->faker->name,
            'email' => $this->faker->unique()->safeEmail,
            'password' => $password ?: $password = bcrypt('secret'),
            'remember_token' => Str::random(10),
        ];
    

这里是EpisodeFactory

public function definition()
    
        return [
            'title' => $this->faker->sentence(),
            'body' => $this->faker->paragraph(5),
            'videoUrl' => 'https://www.quirksmode.org/html5/videos/big_buck_bunny.mp4',
        ];
    

这是CourseFactory

public function definition()
    
        return [
            'title' => $this->faker->sentence(),
            'body' => $this->faker->paragraph(5),
            'price' => $this->faker->numberBetween(1000,10000),
            'image' => $this->faker->imageUrl(),
        ];
    

然后我将此添加到DatabaseSeeder

public function run()
    
        $user = \App\Models\User::factory()->count(30)->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);
            );
        );
    

现在当我运行 php artisan db:seed 时,我得到了这个错误:

异常此集合实例上不存在属性 [id]。

这是指create(['user_id' => $user->id ])DatabaseSeeder

那么这里出了什么问题?我该如何解决这个问题?

这里也是users表的迁移:

public function up()
    
        Schema::create('users', function (Blueprint $table) 
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        );
    

另外,如果您需要查看其他迁移或模型代码,请告诉我,我会立即添加。

【问题讨论】:

你正在创建 30 个用户,id 应该神奇地知道用作 $user->id @BrianThompson 我不明白。我应该怎么做才能解决这个问题? $user = \App\Models\User::factory()->count(30)->create() 创建 30 个用户对吗? count(30) 指示它。这意味着$user 不包含 顾名思义,它包含所有 30 个用户的集合。所以$user->id 没有意义,因为有 30 个 id。您将不得不以某种方式选择其中一个 ID。我不能说怎么做,因为我不知道你想要完成什么 【参考方案1】:

问题可能出在模型的导入上。导入用户模型并执行类似的操作

$user = User::all();

在工厂之上你必须初始化变量

【讨论】:

以上是关于Laravel 8 Seeders:此集合实例上不存在属性 [id]的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 8 类 'Database\Seeders\App\Models\Admin' 未找到

此集合实例上不存在异常属性 []

此集合实例上不存在异常属性 [图像]

在 laravel 8 中出现一个名为“Class 'Database\Seeders\App\Models\Product' not found'' 的错误

此集合实例上不存在属性 [id] [重复]

此集合实例上不存在属性 [stock]