'SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row in Laravel9
I have an integrity constraint violation when I run the php artisan db:seed command in Laravel 9.
Error
PDOException::("SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (
hunger-db.restaurants, CONSTRAINTrestaurants_user_id_foreignFOREIGN KEY (user_id) REFERENCESusers(id) ON DELETE CASCADE)")
setup_users_table
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->string('phone');
$table->tinyInteger('role_as')->default('0');
$table->tinyInteger('gender')->default('0');
$table->string('date_of_birth')->default('1999/9/9');
$table->rememberToken();
$table->timestamps();
});
}
setum_restaurants_table
public function up()
{
Schema::create('restaurants', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('img_src');
$table->string('description');
$table->string('minimum_order_amount');
$table->string('working_hours_open');
$table->string('working_hours_close');
$table->string('delivery_time');
$table->string('delivery_fee');
$table->boolean('status')->default('0');
$table->unsignedBigInteger('user_id')->default('1');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->timestamps();
});
}
User Model
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
protected $fillable = [
'name',
'email',
'password',
'phone',
];
public function orders()
{
return $this->hasMany(Order::class);
}
public function restaurants()
{
return $this->belongsTo(Restaurant::class);
}
}
Restaurant Model
class Restaurant extends Model
{
use HasFactory;
protected $fillable = [
'name',
'img_src',
'description',
];
public function users()
{
return $this->belongsTo(User::class);
}
}
Solution 1:[1]
I see some things to change here
setup_restaurants_table
I don't see with good eyes user_id with default 1, maybe is better to define the value when restaurant is created or manually assign it to user 1.
Schema::create('restaurants', function (Blueprint $table) {
$table->id();
...
$table->foreignId('user_id')->constrained()->onDelete('CASCADE');
});
After DB changes run php artisan migrate:fresh
User.php
Should change relation to hasMany Restaurants
public function restaurants()
{
return $this->hasMany(Restaurant::class);
}
Seeding
Also ensure your DB seeding is correct, I mean creating user first and then restaurant, set user_id with an existing value.
Maybe creating a restaurant like this:
$user = User::factory()
->hasRestaurants(3)
->create();
If any factory change run php artisan db:seed
Can also see Factory Retationship Docs
Solution 2:[2]
Check the user_id you have added to the restaurants table. Make sure it exists in the Users table. Maybe my english not enough to tell you, can check another answer for the problem.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Guille |
| Solution 2 | OSahin |
