无法在 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 创建所有表,否则它不起作用!
我联系你是因为我花了很多时间完全找不到解决方案...
这是我的问题:
我很自然地在 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 创建所有表,否则它不起作用!