Laravel从单个表创建2个表的简单关系

时间:2015-12-08 13:38:11

标签: laravel laravel-5

我有3个模型:UserChangeMoneyCurrencyType,我与UserChangeMoney有简单的关系,我想添加另一个关系ChangeMoney CurrencyType表,但我收到此错误:

  D:\xampp\htdocs\epay-pro>php artisan migrate

  [Illuminate\Database\QueryException]
  SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL
  : alter table `change_money` add constraint change_money_currency_id_foreig
  n foreign key (`currency_id`) references `currency_type` (`id`))

目前我的迁移是:

Schema::create('change_money',function(Blueprint $table){
    $table->increments('id');
    $table->tinyInteger('currency_type');
    $table->string('current_money');
    $table->integer('user_id')->unsigned();
    $table->foreign('user_id')->references('id')->on('users');
    $table->integer('currency');
    $table->timestamps();
});

我没有任何问题,现在我想将其他外键添加到CurrencyType表中,例如:

Schema::create('change_money',function(Blueprint $table){
    $table->increments('id');
    $table->tinyInteger('currency_type');
    $table->string('current_money');
    $table->integer('user_id')->unsigned();
    $table->foreign('user_id')->references('id')->on('users');
    $table->integer('currency_id')->unsigned();
    $table->foreign('currency_id')->references('id')->on('currency_type');
    $table->timestamps();
});

currency_type表格迁移:

Schema::create('currency_type',function(Blueprint $table){
    $table->increments('id');
    $table->integer('user_id')->unsigned();
    $table->foreign('user_id')->references('id')->on('users');
    $table->string('currency_type','50');
    $table->char('currency_symbol','1');
    $table->timestamps();
});

3 个答案:

答案 0 :(得分:1)

Laravel中的迁移按顺序运行。我现在没有您的迁移订单,但我认为您的change_money迁移首先运行的是currency_type迁移。因此,当应用程序尝试将ChangeMoney表中的外键添加到CurrencyType表时,CurrencyType表尚不存在。

尝试创建一个新的迁移,只添加ChangeMoney表和CurrencyType表之间的关系

答案 1 :(得分:0)

您必须从两个表中删除数据(' change_money',' currency_type')。

或者您可以关闭外键检查。在MySQL中,或在phpmyadmin中运行:

SET FOREIGN_KEY_CHECKS=0;

在Laravel中运行迁移:php artisan migrate

然后再次打开外键检查:

SET FOREIGN_KEY_CHECKS=1;

答案 2 :(得分:0)

通过将外键拆分为其他迁移解决问题

class ForeignKeyBetweenChangeMoneyAndCurrencyType extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('change_money', function (Blueprint $table) {
            $table->integer('currency_id')->unsigned();
            $table->foreign('currency_id')->references('id')->on('currency_type');
        });
    }

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