无法在 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 迁移中应用约束/外部的主要内容,如果未能解决你的问题,请参考以下文章