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,
y$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,
]);
}
}
}
Class 型号
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。这个 class id 应该是唯一的。
它在您的模型文件中定义。
如果你想插入相同的 'class_id' 然后改变你的模型和 db 或者改变你的 '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
设置为唯一,但您一直分配相同的值 '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();
});
}
并重新运行 迁移。还要确保它在用户 table.
中得到更改
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,请使用您的播种机。
当我尝试为我的数据库设置种子时,我收到一条错误消息,提示我有一个与键“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,
y$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,
]);
}
}
}
Class 型号
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。这个 class id 应该是唯一的。 它在您的模型文件中定义。 如果你想插入相同的 'class_id' 然后改变你的模型和 db 或者改变你的 '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
设置为唯一,但您一直分配相同的值 '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();
});
}
并重新运行 迁移。还要确保它在用户 table.
中得到更改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,请使用您的播种机。