如何在迁移中定义外键?
How to define foreign keys in migrations?
问题
我想给 table 添加外键。当我 运行 我的 第一次 迁移 create_posts_table
看起来像这样:
Schema::create('posts', function(Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->unsignedInteger('user_id')->index();
// . . .
});
Schema::table('posts', function(Blueprint $table)
{
$table->foreign('user_id')->references('id')
->on('users')->onDelete('cascade');
});
抛出以下错误:
[Illuminate\Database\QueryException] SQLSTATE[HY000]:
General error: 1215 Cannot add foreign key constraint (SQL: alter table
posts
add constraint posts_user_id_foreign
foreign key (user_id
) references users
(id
) on delete cascade)
这是因为users
table还没有创建,因此无法在[=上创建用户引用外键12=] table.
可能的解决方案
此问题的解决方案是在创建所有 table 后 通过新迁移添加外键 。但是,我觉得它很笨重。
问题
我如何在它们各自的 table 迁移 中定义外键,而不是在 [=44] 之后用不同的迁移单独添加它们=] 已创建?
您可以在同一个迁移文件中执行多个迁移。如果你有一个帖子 table,你想要用户 table 的外键,但用户 table 还不存在,你要么必须在用户 [=13] 中进行=] 创建用户 table 后的迁移文件 - 或者你必须进行单独的迁移,就像你说的那样。您无法 "save" 稍后迁移的说明。
laravel 方法是为具有索引、主键和外键的不同表保留单独的迁移文件.....
CreateUsersTable
class CreateUsersTable extends Migration
{
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('email');
$table->string('password', 60);
$table->enum('status', ['0', '1'])->default('0');
$table->rememberToken();
$table->nullableTimestamps();
$table->unique('email');
});
}
public function down()
{
Schema::drop('users');
}
}
CreatePostsTable
class CreatePostsTable extends Migration
{
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
});
}
public function down()
{
Schema::drop('posts');
}
}
问题
我想给 table 添加外键。当我 运行 我的 第一次 迁移 create_posts_table
看起来像这样:
Schema::create('posts', function(Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
$table->unsignedInteger('user_id')->index();
// . . .
});
Schema::table('posts', function(Blueprint $table)
{
$table->foreign('user_id')->references('id')
->on('users')->onDelete('cascade');
});
抛出以下错误:
[Illuminate\Database\QueryException] SQLSTATE[HY000]:
General error: 1215 Cannot add foreign key constraint (SQL: alter table
posts
add constraintposts_user_id_foreign
foreign key (user_id
) referencesusers
(id
) on delete cascade)
这是因为users
table还没有创建,因此无法在[=上创建用户引用外键12=] table.
可能的解决方案
此问题的解决方案是在创建所有 table 后 通过新迁移添加外键 。但是,我觉得它很笨重。
问题
我如何在它们各自的 table 迁移 中定义外键,而不是在 [=44] 之后用不同的迁移单独添加它们=] 已创建?
您可以在同一个迁移文件中执行多个迁移。如果你有一个帖子 table,你想要用户 table 的外键,但用户 table 还不存在,你要么必须在用户 [=13] 中进行=] 创建用户 table 后的迁移文件 - 或者你必须进行单独的迁移,就像你说的那样。您无法 "save" 稍后迁移的说明。
laravel 方法是为具有索引、主键和外键的不同表保留单独的迁移文件.....
CreateUsersTable
class CreateUsersTable extends Migration
{
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('email');
$table->string('password', 60);
$table->enum('status', ['0', '1'])->default('0');
$table->rememberToken();
$table->nullableTimestamps();
$table->unique('email');
});
}
public function down()
{
Schema::drop('users');
}
}
CreatePostsTable
class CreatePostsTable extends Migration
{
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users');
});
}
public function down()
{
Schema::drop('posts');
}
}