我在已运行的Laravel迁移文件夹中进行了以下迁移:
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateAdminTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up() {
Schema::create('Admin' , function($table){
$table->increments('id');
$table->mediumText('title');
$table->text('blog_content');
$table->char('tag' , 15);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down() {
Schema::drop('Admin');
}
}
上面的迁移是针对我的admin
表的,我真正想做的是在我的admin
表中添加一个与我的tags
表关联的外键。类似的东西:
$table->foreign('tag')->references('tag')->on('tags');
如果我已经运行了迁移,我该怎么做?
我尝试了以下内容:
第1步:从phpMyAdmin中删除tag
表中的admin
列。
第2步:尝试运行以下迁移:
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddForeignKeyTagsColumn extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('Admin', function (Blueprint $table) {
$table->char('tag' , 15)->after('slug');
$table->foreign('tag')->references('tag')->on('tags');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
// Schema::drop('Admin');
}
}
但是我收到以下错误:
为什么无法创建外键?
答案 0 :(得分:1)
迁移是数据库的版本控制。如果您不打算使用版本控制功能,那么编写迁移是没有意义的。
简单地说,您可以通过从命令行创建新的迁移来更改表:
php artisan make:migration alter_table_admin_add_foreign_tag
然后在新的迁移中,执行上下方法。
迁移准备就绪后,php artisan migrate
。
关于编辑问题:
两个表都需要innodb
而不是myisam
。此外,列父键和关系键都需要是相同的数据类型。因此,您的tags
表格中也配置了$table->char('tag' , 15);
SIDE NOTE / suggestion:
为什么你有一些单数表和一些复数表。为什么你有一些以大写字母开头的表格,以及其他小写的表格? Admin
可以admins
,tags
可以保持tags
以保持一致。
答案 1 :(得分:-1)
使用以下代码创建新迁移:
public function up() {
Schema::table('Admin' , function($table){
$table->foreign('tag')->references('tag')->on('tags');
});
}
public function down() {
Schema::table('Admin' , function($table){
$table->dropForeign('Admin_tag_foreign');
});
}
然后运行php artisan migrate