When I'm trying to seed my database, but I get an error saying that I have a duplicate entry '1' for the key 'users_class_id_unique.
Does anyone know what is causing this problem?
This is what the error looks like
[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'
This is my seeder file
<?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 MODEL
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 Migration
<?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()
{
//
}
}
Actually you can not insert 'class_id' => 1 for both users . This class id should be unique . And it's defined in your model file . If you want to insert same 'class_id' then change your model and db OR other-wise change your 'class_id' one of them . Such as: '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,
]);
}
}
}
The problem lays inside your migration. Your column class_id
is set to unique but you keep assigning the same value 'class_id' => 1
. Change it to
public function up()
{
Schema::create('classes', function (Blueprint $table) {
$table->increments('id');
$table->integer('subject_id');
$table->string('class_name');
$table->rememberToken();
$table->timestamps();
});
}
and re-run the migrations. Also make sure that it gets changed in the users table.
php artisan migrate:refresh --seed
You will have to figure out yourself whether you need the column to be unique or not. If it has to be unique, you will have to change the seeder to make sure it only seeds unique values for class_id
.
If you cannot re-run the migrations, change the seeder like this:
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,
]);
}
}
In case your class_id
needs to be either 1, 2 or 3, then use your seeder.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.