无法在 Laravel 5.3 迁移中应用约束/外部

Posted

技术标签:

【中文标题】无法在 Laravel 5.3 迁移中应用约束/外部【英文标题】:Unable to apply constraints/foreign in Laravel 5.3 Migrations 【发布时间】:2022-01-03 15:59:36 【问题描述】:

我正在与您联系,因为我在花了很多时间之后绝对找不到解决方案......

这是我的问题:

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

设置完所有内容后,模型/控制器/CRUD 我注意到 ORM 有问题。 当我去创建带有约束的表时,外键通过 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');
      );      

【问题讨论】:

【参考方案1】:

[帖子作者]

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

所以ORM端的代码不错!

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

通过切换到 InnoDB 作为 引擎,它工作了

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

然后添加到 app/config/database

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

其他

在您的迁移文件中:

$table->engine = 'InnoDB';

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

【讨论】:

【参考方案2】:

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

尝试在您的表格中添加:

$table->primary('id');

【讨论】:

非常感谢您的回答,但 increments 相当于:integer(id)->unsigned( )->primary() (+AutoIncrements) 所以我有主键:/

以上是关于无法在 Laravel 5.3 迁移中应用约束/外部的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据库的Laravel迁移“无法添加外键约束”错误

迁移问题:无法在laravel中添加外键约束

无法在 Laravel 迁移中添加外键约束

Laravel 表迁移:无法添加外键约束

Laravel 迁移:无法添加外键约束

无法添加外键约束 - Laravel 迁移错误