如何通过Laravel迁移创建外键?

7
我们如何通过迁移在 Laravel 中创建“引用键(referenced key)”和“外键(foreign key)”? 假设我有两个迁移文件在 Laravel 的数据库目录中,它们分别创建了不同的数据表。第一个迁移创建了一个名为“posts”的表,其中包含一个名为“Id”的列。第二个迁移创建了一个名为“comments”的表,其中包含一个名为“post_id”的列。“posts”表中的“Id”列是“引用键”,而“comments”表中的“post_id”是“外键”。那么,如何将这两个列连接起来呢?

1
你尝试过文档吗?点击链接 - Abe
https://laravel.com/docs/5.5/migrations#foreign-key-constraints - fubar
5个回答

10

最好将外键类型设置为unsignedInteger

$table->unsignedInteger('category_id')->nullable();

$table->foreign('category_id')
       ->references('id')
       ->on('categories')
       ->onUpdate('cascade')
       ->onDelete('some action');;

4

举个例子,你有一个用户表和一个用户地址表。一个用户可以有多个地址,而一个地址属于一个用户。

默认用户表

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

使用user_id作为外键的用户地址表

  Schema::create('user_addresses', function (Blueprint $table) {
            $table->bigIncrements('id'); // by default the primary key is set to unsigned big integer
            $table->unsignedBigInteger('user_id'); //associate the address with a user
            $table->text('address');
            $table->string('city');
            $table->string('country');
            $table->timestamps();

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

在定义完迁移之后,下一步是在各自的模型类中定义它们之间的关系。
在用户模型中添加:
public function address(){
        return $this->hasMany(UserAddress::class );
    }

在UserAddress模型中添加:
 public function user(){
        return $this->belongsTo(User::class, 'user_id');
    }

2
你可以这样使用。
$table->integer('userId')->unsigned();
$table->foreign('userId')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');

2

如果您正在尝试为引用“users”表上的“id”列的表创建外键约束,为了更好的开发体验,您可以按照以下方式编写:

$table->foreignId('user_id')
  ->constrained('users')
  ->onUpdate('cascade')
  ->onDelete('cascade');

1
Schema::table('posts', function (Blueprint $table) {
$table->integer('user_id')->unsigned();

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接