如何在Migration中添加外键 - Laravel 8(详细教程)

478 阅读2分钟

外键是一个字段,用于通过主键建立两个表之间的关系(你也可以使用一个非主键字段,但不建议使用)。

在本教程中,我展示了如何在Laravel 8项目中使用迁移创建表时添加外键约束。

How to add Foreign key in migration - Laravel 8


内容

  1. 数据库配置
  2. 创建表并添加外键
  3. 模型
  4. 结语

1.数 据库配置

打开.env 文件。

指定主机、数据库名称、用户名和密码。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=tutorial
DB_USERNAME=root
DB_PASSWORD=

2.创 建表并添加外键

使用迁移创建countries,states, 和cities 表。

我正在为statescities 表添加外键。

  • states 表被链接到 表,并且countries
  • cities 表与 表相连接。states

  • 创建Countries 表 -
php artisan make:migration create_countries_table
  • 现在,从项目根目录导航到database/migration/ 文件夹。
  • 找到一个以create_countries_table 结尾的PHP文件并打开它。
  • up() 方法中定义表的结构。
public function up()
{
    Schema::create('countries', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->timestamps();
    });
}

  • 创建States 表 -
php artisan make:migration create_states_table
  • 同样地,在database/migration/ 文件夹中找到一个以create_states_table 结尾的PHP文件并打开。
  • up() 方法中定义表的结构。

添加外键 -

  • 我正在为country_id 字段添加外键。
  • 设置这个字段的数据类型为UNSIGNED BIGINT -$table->unsignedBigInteger('country_id'); 。数据类型必须是UNSIGNED ,并且与父表的链接字段数据类型相同。
  • 这里,countriesid 字段的数据类型是biginteger
  • 添加外键 -
$table->foreign('country_id')
     ->references('id')->on('countries')->onDelete('cascade');

值 -

  • foreign() -传递你想用外键约束的字段名。
  • references() -传递连接表的字段名。
  • on() -连接表的名称。
  • onDelete('cascade') -启用删除附加数据。
public function up()
{
    Schema::create('states', function (Blueprint $table) {
         $table->id();
         $table->unsignedBigInteger('country_id');
         $table->string('name');
         $table->timestamps();
         $table->foreign('country_id')
              ->references('id')->on('countries')->onDelete('cascade');
    });
}

  • 创建Cities 表 -
php artisan make:migration create_cities_table
  • 同样,在database/migration/ 文件夹中找到一个以create_cities_table 结尾的PHP文件并打开它。
  • up() 方法中定义表的结构。

添加外键 -

  • 我正在为states_id 字段添加外键。
  • 设置这个字段的数据类型为UNSIGNED BIGINT -$table->unsignedBigInteger('state_id'); 。数据类型必须是UNSIGNED ,并且与父表的链接字段数据类型相同。
  • 这里,statesid 字段的数据类型为biginteger
  • 添加外键 -
$table->foreign('state_id')
     ->references('id')->on('states')->onDelete('cascade');

值 -

  • foreign() -传递你想用外键约束的字段名。
  • references() -传递连接表的字段名。
  • on() -连接表的名称。
  • onDelete('cascade') -启用删除附件数据的功能。
public function up()
{
    Schema::create('cities', function (Blueprint $table) {
         $table->id(); 
         $table->unsignedBigInteger('state_id');
         $table->string('name');
         $table->foreign('state_id')
                  ->references('id')->on('states')->onDelete('cascade');
         $table->timestamps();
    });
}

  • 运行迁移以创建表 -
php artisan migrate

3.模 型

创建国家、州和城市模型。

  • 创建Countries 模型。
php artisan make:model Countries
  • 打开app/Models/Countries.php 文件。
  • 指定大量可分配的模型属性 -name 使用$filliable 属性。

完成的代码

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Countries extends Model
{
      use HasFactory;

      protected $fillable = [
          'name'
      ];
}

  • 创建States 模型:
php artisan make:model States
  • 打开app/Models/States.php 文件。
  • 指定大量可分配的模型属性 -country_id ,和使用$filliable 属性的name

完成的代码

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class States extends Model
{
      use HasFactory;

      protected $fillable = [
           'country_id','name'
      ];
}

  • 创建Cities 模型:

php artisan make:modelCities

  • 打开app/Models/Cities.php 文件。
  • 指定大量可分配的模型属性 -state_id, 和使用$filliable 属性的name

完成的代码

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Cities extends Model
{
      use HasFactory;

      protected $fillable = [
         'state_id','name'
      ];
}

4.总 结

在这个例子中,我在一个表上添加了一个外键,但你可以按照同样的步骤在一个表上添加一个以上的外键。

你可以从这里了解到更多信息。