خطای : Cannot add foreign key constraint in laravel
https://lamtakam.com/qanda/2352/خطای--Cannot-add-foreign-key-constraint-in-laravel 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();
});
}
ستون user_id
رو اضافه کردم که به ستون id
تیبل users
رفرنس داده شده
و این هم مایگریشن users
Schema::create('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('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();
});
1 | با چه کامندی migration رو اجرا میکنی؟ پیشنهاد من اینه که یک مرتبه ریست بکنی php artisan migrate:fresh --seed ــ سعید مرادی در 6 سال قبل |
||
@سعید.مرادی
php artisan migrate . این مورد رو هم تست کردم اما نشد ــ مجتبی دلشاد در 6 سال قبل |
|||
1 | ببین وقتی میخوای یک رابطه (یا همون relation) بین 2 ستون بسازی، لازمش اینه که اون 2 ستون توی دیتابیس دقیقا ساختار مشابهی داشته باشن. به این معنی که نوع و اندازشون باید یکسان باشه. الان توی جدول users ، ستون id به صورت unsigned نیست، ولی توی جدول gateway_transactions ستون user_id به صورت unsigned هست. پس نمیتونی بین این 2 تا ستون رابطه ایجاد کنی. کافیه ->unsigned() رو برای ستون user_id حذف کنی و مجددا php artisan migrate:fresh --seed رو بزنی. ــ سجاد شفی زاده |
||
@سجاد.شفی.زاده.★ بازهم نشد متاسفانه. کلی راجب این مشکل سرچ کردم و راه های مختلف رو که گفته بودن تست کردم اما حل نشد ــ مجتبی دلشاد در 6 سال قبل | |||
2 | خب یه کاری کن، بجای اینکه با ماگریشن های لاراول این ارتباط رو بسازی، به صورت دستی با phpmyadmin یا workbench امتحان کن ببین ساخته میشه یا نه. از اونجا شاید کنترل و دیباگ کردنش ساده تر باشه. اگه ارورش عوض شد یا با چیز جدیدی مواجه شدی با ما هم به اشتراک بزار شاید بتونیم کمک کنیم. ــ سجاد شفی زاده |
||
بله حتما تست میکنم. اما یه موردی وجود داره. توی مایگریشن اگه دقت کرده باشید انجین تیبل رو
innoDB قرارداده و انجین تمام تیبل های پروژه
MyISAM هستش. من برای مایگریشن این پکیج هم انجین
MyISAM قرار دادم و بدون هیچ خطایی مایگریت انجام شد. اما یه مشکلی وجود داره حتما باید انجین تیبل پکیج
innoDB باشه چون از
transaction پشتیبانی کنه و قابلیت لاک کردن رکورد رو داشته باشه که برای پرداخت ها مشکلی بوجود نیاد.@سجاد.شفی.زاده.★ ــ مجتبی دلشاد در 6 سال قبل |
|||
حالا اومدم توی کانفیگ دیتابیس لاراول انجین رو
innoDB قرار تا برای تمام جداول همین ست شه و این اتفاق هم افتاد اما مجددا بعد از مایگریت همون خطا دریافت شد...البته من اطلاعات زیادی ندارم و خیلی مطمئن نیستم که مشکل از متفاوت بودن انجین دو تیبل باشه@سجاد.شفی.زاده.★ ــ مجتبی دلشاد در 6 سال قبل |
|||
2 | دوست عزیز، وقتی توی کامنت های میخوای به صورت کد بنویسی، کافیه کاراکتر ` رو قبل و بعد از متن مورد نظرت بزاری. احساس میکنم بیشتر از چیزی که باید میزاری ــ سعید مرادی در 6 سال قبل |