簡體   English   中英

Laravel播種錯誤SQLSTATE [23000]

[英]Laravel Seeding error SQLSTATE[23000]

當我嘗試播種數據庫時,出現一條錯誤消息,說我對鍵“ users_class_id_unique”有重復的條目“ 1”。

有誰知道是什么引起了這個問題?

這是錯誤的樣子

[Illuminate\Database\QueryException]
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' 
for key 'users_class_id_unique' (SQL: insert into `users` (`name`, 
`lastname`, `email`, `class_id`, `password`
`role_id`, `created_at`, `updated_at`) values (Example, Name, 
example@outlook.com, 1, 
$2y$10$gqFXkYt9LRoCH6LqsosEPOI/2t.VDoNzBgV3x/przh.1KiuJqvRwe, 2, 1971-06-20 
06:10:44, 1975-03-0
9 17:46:23))



[PDOException]
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1' 
for key 'users_class_id_unique'

這是我的種子文件

<?php

use Faker\Factory;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class UsersTableSeeder extends Seeder
{
/**
 * Run the database seeds.
 *
 * @return void
 */
public function run()
{
    $faker = Faker\Factory::create();

    //Zeker weten dat de eerste user één admin is
    DB::table('users')->insert([
        'name' => 'Rainier',
        'lastname' => 'Laan',
        'email' => 'rainier.laan@home.nl',
        'class_id' => 1,
        'password' => bcrypt('welkom'),
        'role_id' => 2,
        'created_at' => $faker->dateTime,
        'updated_at' => $faker->dateTime,
    ]);

    DB::table('users')->insert([
        'name' => 'Collin',
        'lastname' => 'Nieuw Beerta',
        'email' => 'collinweetnietwelkeemail@hotmail.com',
        'class_id' => 1,
        'password' => bcrypt('welkom'),
        'role_id' => 1,
        'created_at' => $faker->dateTime,
        'updated_at' => $faker->dateTime,
    ]);

    DB::table('users')->insert([
        'name' => 'Godpieter',
        'lastname' => 'alwin',
        'email' => 'Godpieter@Allmightygodpieter.com',
        'class_id' => 1,
        'password' => bcrypt('welkom'),
        'role_id' => 2,
        'created_at' => $faker->dateTime,
        'updated_at' => $faker->dateTime,
    ]);

    // Onderste code maakt 8 random users aan met het wachtwoord 'Welkom'

    foreach(range(1,7) as $index) {
        DB::table('users')->insert([
            'name' => $faker->name,
            'lastname' => $faker->lastName,
            'email' => $faker->email,
            'class_id' => rand(1, 3),
            'password' => bcrypt('welkom'),
            'role_id' => 1,
            'created_at' => $faker->dateTime,
            'updated_at' => $faker->dateTime,
        ]);
    }
}
}

類模型

namespace App;

use Illuminate\Database\Eloquent\Model;

class Classes extends Model
{
protected $fillable = [
    'class_name', 'subject_id',
];

public function subjects() {
    return $this->hasMany('App\Subject');
}

public function users() {
    return $this->hasMany('App\User');
}


}

CLASS遷移

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateClassesTable extends Migration
{
/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('classes', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('subject_id');
        $table->string('class_name')->unique();
        $table->rememberToken();
        $table->timestamps();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    //
}
}

實際上,您不能為兩個用戶都插入'class_id'=> 1。 此類的ID應該是唯一的。 它在模型文件中定義。 如果要插入相同的“ class_id”,請更改模型和數據庫,否則,請更改其中的“ class_id”。 如:'class_id'=> 1,'class_id'=> 2,

<?php

use Faker\Factory;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class UsersTableSeeder extends Seeder
{
/**
 * Run the database seeds.
 *
 * @return void
 */
public function run()
{
    $faker = Faker\Factory::create();

    //Zeker weten dat de eerste user één admin is
    DB::table('users')->insert([
        'name' => 'Rainier',
        'lastname' => 'Laan',
        'email' => 'rainier.laan@home.nl',
        'class_id' => 1,
        'password' => bcrypt('welkom'),
        'role_id' => 2,
        'created_at' => $faker->dateTime,
        'updated_at' => $faker->dateTime,
    ]);

    DB::table('users')->insert([
        'name' => 'Collin',
        'lastname' => 'Nieuw Beerta',
        'email' => 'collinweetnietwelkeemail@hotmail.com',
        'class_id' => 2,
        'password' => bcrypt('welkom'),
        'role_id' => 1,
        'created_at' => $faker->dateTime,
        'updated_at' => $faker->dateTime,
    ]);

    DB::table('users')->insert([
        'name' => 'Godpieter',
        'lastname' => 'alwin',
        'email' => 'Godpieter@Allmightygodpieter.com',
        'class_id' => 3,
        'password' => bcrypt('welkom'),
        'role_id' => 2,
        'created_at' => $faker->dateTime,
        'updated_at' => $faker->dateTime,
    ]);

    // Onderste code maakt 8 random users aan met het wachtwoord 'Welkom'

    foreach(range(4,10) as $index) {
        DB::table('users')->insert([
            'name' => $faker->name,
            'lastname' => $faker->lastName,
            'email' => $faker->email,
            'class_id' => rand(1, 3),
            'password' => bcrypt('welkom'),
            'role_id' => 1,
            'created_at' => $faker->dateTime,
            'updated_at' => $faker->dateTime,
        ]);
    }
}
}

問題出在您的遷移之內。 您的列class_id設置為unique,但是您一直分配相同的值'class_id' => 1 更改為

public function up()
{
    Schema::create('classes', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('subject_id');
        $table->string('class_name');
        $table->rememberToken();
        $table->timestamps();
    });
}

並重新運行遷移。 還要確保在用戶表中對其進行了更改。

php artisan migrate:refresh --seed

您將必須弄清楚自己是否需要該列唯一。 如果必須是唯一的,則必須更改播種器,以確保它僅播種class_id唯一值。

如果您無法重新運行遷移,請按以下方式更改種子:

class UsersTableSeeder extends Seeder
{
/**
 * Run the database seeds.
 *
 * @return void
 */
public function run()
{
    $faker = Faker\Factory::create();

    //Zeker weten dat de eerste user één admin is
    DB::table('users')->insert([
        'name' => 'Rainier',
        'lastname' => 'Laan',
        'email' => 'rainier.laan@home.nl',
        'class_id' => 1,
        'password' => bcrypt('welkom'),
        'role_id' => 2,
        'created_at' => $faker->dateTime,
        'updated_at' => $faker->dateTime,
    ]);

    DB::table('users')->insert([
        'name' => 'Collin',
        'lastname' => 'Nieuw Beerta',
        'email' => 'collinweetnietwelkeemail@hotmail.com',
        'class_id' => 2,
        'password' => bcrypt('welkom'),
        'role_id' => 1,
        'created_at' => $faker->dateTime,
        'updated_at' => $faker->dateTime,
    ]);

    DB::table('users')->insert([
        'name' => 'Godpieter',
        'lastname' => 'alwin',
        'email' => 'Godpieter@Allmightygodpieter.com',
        'class_id' => 3,
        'password' => bcrypt('welkom'),
        'role_id' => 2,
        'created_at' => $faker->dateTime,
        'updated_at' => $faker->dateTime,
    ]);

    // Onderste code maakt 8 random users aan met het wachtwoord 'Welkom'

    foreach(range(4,10) as $index) {
        DB::table('users')->insert([
            'name' => $faker->name,
            'lastname' => $faker->lastName,
            'email' => $faker->email,
            'class_id' => $index,
            'password' => bcrypt('welkom'),
            'role_id' => 1,
            'created_at' => $faker->dateTime,
            'updated_at' => $faker->dateTime,
        ]);
    }
}

如果您的class_id需要為1、2或3,請使用您的播種器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM