我试图在Laravel 5.7中创建外键,但是当我使用artisan迁移表时,抛出了以下错误:
Illuminate \ Database \ QueryException:
SQLSTATE [HY000]:常规错误:1215无法添加外键约束(SQL:更改表
gateway_transactions
添加约束gateway_transactions_user_id_foreign
外键(user_id
)引用users
(id
)删除CASCADE)
我的迁移:
public function up()
{
Schema::create('gateway_transactions', function (Blueprint $table) {
$table->engine = "innoDB";
$table->unsignedBigInteger('id', true);
$table->integer('user_id')->unsigned();
$table->enum('provider', \Parsisolution\Gateway\GatewayManager::availableDrivers());
$table->decimal('amount', 15, 2);
$table->integer('order_id')->nullable();
$table->string('currency', 3)->nullable();
$table->string('ref_id', 100)->nullable();
$table->string('tracking_code', 50)->nullable();
$table->string('card_number', 50)->nullable();
$table->enum('status', \Parsisolution\Gateway\Transaction::availableStates())
->default(\Parsisolution\Gateway\Transaction::STATE_INIT);
$table->string('ip', 20)->nullable();
$table->json('extra')->nullable();
$table->timestamp('paid_at')->nullable();
$table->nullableTimestamps();
$table->softDeletes();
});
Schema::table('gateway_transactions', function(Blueprint $table) {
$table->foreign('user_id')->references('id')->on('users')->onDelete('CASCADE');
});
}
用户迁移:
Schema::create(config('access.table_names.users'), function (Blueprint $table) {
$table->increments('id');
$table->uuid('uuid');
$table->string('first_name')->nullable();
$table->string('last_name')->nullable();
$table->string('email')->unique();
$table->string('avatar_type')->default('gravatar');
$table->string('avatar_location')->nullable();
$table->string('password')->nullable();
$table->timestamp('password_changed_at')->nullable();
$table->tinyInteger('active')->default(1)->unsigned();
$table->string('confirmation_code')->nullable();
$table->boolean('confirmed')->default(config('access.users.confirm_email') ? false : true);
$table->string('timezone')->nullable();
$table->text('National_Code')->nullable();
$table->char('phone_number', 11)->nullable()->unique();
$table->integer('phone_verify')->default(0);
$table->char('mobile_number', 11)->nullable()->unique();
$table->integer('mobile_verify')->default(0);
$table->text('state')->nullable();
$table->text('city')->nullable();
$table->text('address')->nullable();
$table->text('path')->nullable();
$table->char('postal_code', 10)->nullable();
$table->timestamp('last_login_at')->nullable();
$table->string('last_login_ip')->nullable();
$table->rememberToken();
$table->timestamps();
$table->softDeletes();
});
答案 0 :(得分:1)
为此更改代码:
public function up()
{
Schema::create('gateway_transactions', function (Blueprint $table) {
$table->engine = "innoDB";
$table->unsignedBigInteger('id', true);
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users')->onDelete('CASCADE');
$table->enum('provider', \Parsisolution\Gateway\GatewayManager::availableDrivers());
$table->decimal('amount', 15, 2);
$table->integer('order_id')->nullable();
$table->string('currency', 3)->nullable();
$table->string('ref_id', 100)->nullable();
$table->string('tracking_code', 50)->nullable();
$table->string('card_number', 50)->nullable();
$table->enum('status', \Parsisolution\Gateway\Transaction::availableStates())
->default(\Parsisolution\Gateway\Transaction::STATE_INIT);
$table->string('ip', 20)->nullable();
$table->json('extra')->nullable();
$table->timestamp('paid_at')->nullable();
$table->nullableTimestamps();
$table->softDeletes();
});
}
我认为-以下部分是我对Laravel工作方式的理解。
由于要在第一个模式中创建表,因此必须将外键放入创建中。
问题在于Laravel Migration将在应用代码之前验证一切正常,但是阶段是up()函数。因此,其中的所有内容都处于同一阶段。迁移认为您的gateway_transactions不存在,并且它在验证一切正常时不存在。代码将在何时存在。
答案 1 :(得分:1)
外键列的类型必须与引用表完全相同。
如果“用户”表的ID是一个大整数:
$table->bigIncrements('id');
您的外键必须是:
$table->unsignedBigInteger('user_id');
然后迁移将正常工作。