无法迁移外键

时间:2016-07-05 18:45:55

标签: php laravel-5.2 migrate

这是车辆迁移:

public function up()
    {
        Schema::create('Vehicles', function (Blueprint $table) {
            $table->increments('serie');
            $table->string('color');
            $table->integer('power');
            $table->float('capacity');
            $table->float('speed');
            $table->integer('maker_id')->unsigned();
            $table->timestamps();
        });

        Schema::table('Vehicles', function (Blueprint $table){
            $table->foreign('maker_id')->references('id')->on('Makers');
        });
    }

这是Makers Migrate:

public function up()
    {
        Schema::create('Makers', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->integer('phone');
            $table->timestamps();
        });
    }

当我运行artisan migrate时,我收到了以下错误消息。

 [Illuminate\Database\QueryException]
 SQLSTATE[HY000]: General error: 1005 Can't create table `api`.`#sql-14b0_71
 ` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter t
 able `Vehicles` add constraint `vehicles_maker_id_foreign` foreign key (`ma
 ker_id`) references `Makers` (`id`))



 [PDOException]
 SQLSTATE[HY000]: General error: 1005 Can't create table `api`.`#sql-14b0_71
 ` (errno: 150 "Foreign key constraint is incorrectly formed")

我想创建两个表:Vehicles&制造商。在车辆中,maker_id是外键。我从各种来源阅读了一些关于laravel迁移的参考资料。但我无法找到解决方案。

4 个答案:

答案 0 :(得分:0)

注意您的迁移文件顺序,您有两个解决方案:

  1. 更改顺序:首先制作Makers Migrate文件,然后Vehicles Migrate
  2. 如果Makers Migrate文件出现在Vehicles Migrate文件之后且您不想更改订单,请移动:

    Schema::table('Vehicles', function (Blueprint $table){
        $table->foreign('maker_id')->references('id')->on('Makers');
    });
    

    Makers Migrate档案。

答案 1 :(得分:0)

现在我删除制造商迁移文件并运行车辆迁移文件。以下是车辆迁移文件。

public function up()
    {
        Schema::create('Vehicles', function (Blueprint $table) {
            $table->increments('serie');
            $table->string('color');
            $table->integer('power');
            $table->float('capacity');
            $table->float('speed');
            $table->integer('maker_id')->unsigned();
            $table->timestamps();
        });
    }

但是我得到了以下错误

PHP Fatal error:  Cannot redeclare class CreateVehicleTable in C:\xampp\htdocs\m
yownapi\database\migrations\2016_07_05_190215_vehicles_table.php on line 35


  [Symfony\Component\Debug\Exception\FatalErrorException]
  Cannot redeclare class CreateVehicleTable

答案 2 :(得分:0)

现在它可以正常使用以下代码

Makers Migrate

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class MakersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('Makers', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->integer('phone');
            $table->timestamps();
        });

        Schema::table('Vehicles', function(Blueprint $table){
            $table->foreign('maker_id')->references('id')->on('makers');
        });
    }

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

车辆迁移

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class VehiclesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('Vehicles', function (Blueprint $table) {
            $table->increments('serie');
            $table->string('color');
            $table->float('power');
            $table->float('capacity');
            $table->integer('maker_id')->unsigned();
            $table->timestamps();
        });
    }

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

答案 3 :(得分:0)

有一种简单的方法可以做到这一点。在车辆迁移中,进行以下更改

public function up()
{
    Schema::create('Vehicles', function (Blueprint $table) {
        $table->increments('serie');
        $table->string('color');
        $table->integer('power');
        $table->float('capacity');
        $table->float('speed');
        $table->integer('maker_id')
        $table->foreign('maker_id')
              ->references('id')->on('Makers');
        $table->timestamps();
    });
}

由于您将在制作者中添加 id 列中的值,因此Laravel已经退缩了,所以实际上没有必要添加unsigned(那里的财产。如果你在那里添加它仍然可以。

希望我已经回答了你的问题。 For More Details