Laravel 8 外键

Sha*_*sin 3 migration laravel laravel-8

我尝试迁移具有外键的表。每次我迁移表时都会产生一个错误,内容如下:

一般错误:1215 无法添加外键约束

这是我的表迁移:

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');
});
Run Code Online (Sandbox Code Playgroud)

这是我的模型:

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

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

这是我的用户表迁移:

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();
});
Run Code Online (Sandbox Code Playgroud)

小智 5

将 user_id col 从 bigInteger 更新为 UnsignedBigInteger,因为 PK 和 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');
});
Run Code Online (Sandbox Code Playgroud)

我建议遵循约定并使用foreignId()方法和constrained()

示例(来自文档):

Schema::table('posts', function (Blueprint $table) {
    $table->foreignId('user_id')->constrained();
});
Run Code Online (Sandbox Code Playgroud)

您可以在此处获取更多详细信息:https://laravel.com/docs/8.x/migrations#foreign-key-constraints