Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php laravel和artisan错误无法在迁移时添加外键_Php_Mysql_Database_Laravel 4_Laravel Artisan - Fatal编程技术网

Php laravel和artisan错误无法在迁移时添加外键

Php laravel和artisan错误无法在迁移时添加外键,php,mysql,database,laravel-4,laravel-artisan,Php,Mysql,Database,Laravel 4,Laravel Artisan,我知道这个问题已经被回答了很多次,因为我在写问题的时候看到了很多答案和建议,但是没有一个能给我正确的答案 当我尝试向表中添加新字段并在laravel中使用artisan migrate时,我得到一个错误 General error: 1215 Cannot add foreign key constraint (SQL: alter table `pages` add constraint pages_page_status_foreign foreign key (`page_status`)

我知道这个问题已经被回答了很多次,因为我在写问题的时候看到了很多答案和建议,但是没有一个能给我正确的答案

当我尝试向表中添加新字段并在laravel中使用artisan migrate时,我得到一个错误

General error: 1215 Cannot add foreign key constraint (SQL: alter table `pages` add constraint pages_page_status_foreign foreign key (`page_status`) references `page_status` (`status_value`))
但我不明白为什么我会出错,在我做同样的事情之前,没有错误,我能想到的唯一答案是不可能在同一张表上有两个或更多外键。这是我的迁移函数

class CreateStatusTable extends Migration {

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('page_status', function($table) {
        $table->increments('id');
        $table->string('status_name');
        $table->integer('status_value')->unsigned();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::drop('page_status');
}
}

这是状态表,现在我必须使用它向pages表添加新字段

class AddStatusToPagesTable extends Migration {

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::table('pages', function($table) {
        $table->integer('page_status')->unsigned();

        $table->foreign('page_status')->references('status_value')->on('page_status');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::table('pages', function($table) {
        $table->dropForeign('pages_page_status_foreign');
    });
}

}
这就是出现错误的地方,由于某些原因,它不允许我将page_status字段上的外键设置到pages表中

我在本地主机上使用xampp安装,在phpmyadmin中,我可以看到表被设置为innodb,实际上默认情况下所有内容都被设置为innodb。在我的数据库中的pages表中查看pages_状态字段,我首先要设置它的索引,然后才能使用关系。为什么它没有设置为索引我不知道,但我已经在那个表上有了索引id和外键author

在此之前,在创建pages表和使用此表时,我还添加了几个字段

class CreatePagesTable extends Migration {

/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('pages', function($table){
        $table->increments('id');
        $table->integer('author')->unsigned();
        $table->foreign('author')->references('id')->on('users');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::drop('pages');
}
}

我在使用migrate时没有遇到任何问题,它工作得很好,并且author设置为外键


那么为什么我现在不能添加新的外键呢?

这可能是因为如果当前记录不符合条件,则无法添加外键。如果
page\u status
是可选的,则将字段设置为空:

$table->integer('page_status')->unsigned()->nullable();
如果不想使其为空,并且以后要插入有效的外键值,可以暂时禁用外键检查:

DB::statement('SET FOREIGN_KEY_CHECKS = 0');

Schema::table('pages', function($table) {
    $table->integer('page_status')->unsigned();
    $table->foreign('page_status')->references('status_value')->on('page_status');
});

DB::statement('SET FOREIGN_KEY_CHECKS = 1');

我发现了问题所在,在向表中添加一个新字段后,您必须在该字段上设置索引,因此在迁移过程中,将字段设置为索引需要进一步的步骤

我仍然不明白为什么在我的第一次迁移中,当我添加“author”字段时,它会自动将其作为索引,但对于这一次,我通过如下方式额外设置索引使其工作:

    Schema::table('pages', function($table) {
        $table->integer('status')->unsigned()->nullable();
        $table->index('status');

        $table->foreign('status')->references('status_value')->on('page_status');
    });

但为什么它不能满足条件,正如我在示例中添加“author”外键时所显示的那样,添加nullable()不会改变任何东西,但我仍然得到了错误。当数据库中没有行时,您添加了第一个外键。现在可能有一些,这是造成问题的原因。您尝试过外键检查方法吗?我没有尝试过外键检查方法,但我通过手动将字段设置为索引使其工作,您可以在下面的答案中看到。有趣的。。。不管怎么说,很高兴你解决了:)