无法在 Laravel 5.3 迁移中应用 constraints/foreign

Unable to apply constraints/foreign in Laravel 5.3 Migrations

我联系你是因为我花了很多时间完全找不到解决方案...

这是我的问题:

我很自然地在 Laravel 5.3(项目恢复)上创建了我的 table 以迎接新功能的到来。

设置完所有内容后,Model/ Controller/CRUD 我注意到 ORM 有问题。 当我去创建带有约束的 table 时,外键通过 orm.它没有完全应用它。也就是说,它将键定义为索引,但不会创建约束... 我尝试使用 DB::statement 但结果相同。

我尝试更新 doctrine/dblab 但没有成功。 您认为 MySQL 版本可能是原因吗? 设置有问题吗? 知道以前的迁移存在约束!

在此先感谢那些愿意帮助我的人!

看: Img : Viewpoint on HeidiSQL

申请类型:

Schema::create('application_types', function (Blueprint $table) {
           
            //Ids
            $table->increments('id');

            // details
            $table->char('type', 50)->unique();

            // dates
            $table->timestamp('created_at')->useCurrent(); // useCurrent equals to -> default(DB::raw('CURRENT_TIMESTAMP'))
            $table->timestamp('updated_at')->nullable()->default(DB::raw('NULL ON UPDATE CURRENT_TIMESTAMP'));
        });

应用类别:

Schema::create('application_categories', function (Blueprint $table) {
           
            //Ids
            $table->increments('id');

            // details
            $table->char('name', 50)->unique();

            // dates
            $table->timestamp('created_at')->useCurrent(); // useCurrent equals to -> default(DB::raw('CURRENT_TIMESTAMP'))
            $table->timestamp('updated_at')->nullable()->default(DB::raw('NULL ON UPDATE CURRENT_TIMESTAMP'));
        });

应用程序:

Schema::create('applications', function (Blueprint $table) {
           
            //Ids
            $table->increments('id', true);
            $table->integer('type_id')->unsigned(); // -> link to application types table
            $table->integer('document_id')->unsigned(); // -> link to documents table
            $table->integer('category_id')->unsigned(); // -> link to application category table
            $table->integer('referent_id')->unsigned(); // -> link to dir_people table
            $table->integer('created_by_user_id')->unsigned(); // -> link to users table
            $table->integer('updated_by_user_id')->unsigned()->nullable(); // -> link to users table


            // details
            $table->char('name', 50);
            $table->longtext('description');
            $table->longtext('path');
            $table->boolean('is_active')->default(1);

            // dates
            $table->timestamp('created_at')->useCurrent(); // useCurrent equals to -> default(DB::raw('CURRENT_TIMESTAMP'))
            $table->timestamp('updated_at')->nullable()->default(DB::raw('null ON UPDATE CURRENT_TIMESTAMP'));      
      });

// == Set foreign keys == 
Schema::table('applications', function (Blueprint $table) {
            
            //Document
            $table->unique('document_id');

            $table->foreign('document_id')
                  ->references('id')->on('documents')
                  ->onDelete('cascade');

            // Application type
            $table->foreign('type_id')
                  ->references('id')->on('application_types');

            // Application Category
            $table->foreign('category_id')
            ->references('id')->on('application_categories');

            // Referent_id
            $table->foreign('referent_id')
                  ->references('id')->on('dir_people');
            
            // Created by User
            $table->foreign('created_by_user_id')
                  ->references('id')->on('users');
            
            // Updated by User
            $table->foreign('updated_by_user_id')
                  ->references('id')->on('users');
      });      

外键未在数据库中创建,因为它必须引用主键,我认为您的迁移不是这种情况

尝试在您的表格中添加:

$table->primary('id');

[post]

的作者

我检查了是否可以直接在 MySql 上创建它,令我惊讶的是它不起作用。

所以ORM这边的代码是好的!

但是我找到了解决方案,它可以帮助某人。

通过切换到 InnoDB 作为 引擎 有效

如果您使用 WAMP,请检查安装是否完成!(我的是)

然后添加到app/config/database

'connections' => [
   'mysql' => [
      //...
      'engine' => 'InnoDB'
   ]
]

其他

在您的 migrations 文件中:

$table->engine = 'InnoDB';

绝对有必要使用 InnoDB 创建所有表,否则它不起作用!