Laravel8 不会对迁移创建外键约束

问题描述

我正在使用 Laravel8。我有两个表 contact_listscontacts

contact_lists有很多contacts

这是我在 contact_lists生成外键约束的迁移代码

public function up()
   {
      Schema::create('contacts',function (Blueprint $table) {
         $table->id();
         $table->unsignedBigInteger('user_id');
         $table->foreignId('contact_list_id')->nullable()->constrained()->onDelete('cascade');
         $table->string('first_name');
         $table->string('last_name');
         $table->string('phone');
         $table->longText('organization')->nullable();
         $table->longText('note')->nullable();
         $table->timestamps();
      });
   }

但我不知道为什么没有生成外键。

解决方法

Laravel 使用 MyISAM 作为默认的 mysql 存储引擎。 所以请确保在 config/database/

'engine' => 'InnoDB'

默认:

'mysql' => [
                'driver' => 'mysql','url' => env('DATABASE_URL'),'host' => env('DB_HOST','127.0.0.1'),'port' => env('DB_PORT','3306'),'database' => env('DB_DATABASE','forge'),'username' => env('DB_USERNAME','password' => env('DB_PASSWORD',''),'unix_socket' => env('DB_SOCKET','charset' => 'utf8mb4','collation' => 'utf8mb4_unicode_ci','prefix' => '','prefix_indexes' => true,'strict' => true,'engine' => null,'options' => extension_loaded('pdo_mysql') ? array_filter([
                    PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),]) : [],],

更新:

'mysql' => [
            'driver' => 'mysql','engine' => 'InnoDB','options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),