Shariffuddin Hussin
Shariffuddin Hussin

Reputation: 113

laravel 8 foreign key

I try to migrate my table that have a foreign keys. Every time I migrate my table it produce an error which is saying:

General error: 1215 Cannot add foreign key constraint

Here is my table migration:

Schema::create('profile_pictures', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->bigInteger('user_id')->nullable();
    $table->binary('image')->nullable();
    $table->timestamps();

    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});

And here is my model:

class ProfilePicture extends Model
{
    protected $fillable = [
        'user_id',
        'image'
    ];

    public function user()
    {
        $this->belongsTo(User::class, 'user_id', 'id');
    }
}

Here is my user table migration:

Schema::create('users', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('username');
    $table->string('first_name')->nullable();
    $table->string('last_name')->nullable();
    $table->string('email')->unique();
    $table->string('phone')->nullable();
    $table->timestamp('email_verified_at')->nullable();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
});

Upvotes: 3

Views: 18053

Answers (2)

Kieu Trung
Kieu Trung

Reputation: 169

According to WL#148, a foreign key column must have the same data type + the same length + the same scale as the corresponding referenced column.

I think you should use

$table->unsignedBigInteger('user_id')->nullable(); 

Instead of

$table->bigInteger('user_id')->nullable();

Upvotes: 3

Jaswinder Singh
Jaswinder Singh

Reputation: 731

Update the user_id col from bigInteger to UnsignedBigInteger as you need the same datatype and length for PK and FK.

Schema::create('profile_pictures', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedBigInteger('user_id');
    $table->binary('image')->nullable();
    $table->timestamps();

    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});

I will suggest to follow convention and use foreignId() method with constrained()

Sample(from documentation):

Schema::table('posts', function (Blueprint $table) {
    $table->foreignId('user_id')->constrained();
});

You can get more details here: https://laravel.com/docs/8.x/migrations#foreign-key-constraints

Upvotes: 5

Related Questions