在Laravel

时间:2017-02-11 19:46:07

标签: php laravel laravel-5

我在已运行的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');
    }
}

但是我收到以下错误:

enter image description here

为什么无法创建外键?

2 个答案:

答案 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可以adminstags可以保持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