Ограничение внешнего ключа неверно: два внешних ключа мигрируют в laravel 11

Я создаю простую систему управления складом в laravel 11. Когда я попытался перенести таблицы и назначить внешние ключи, я столкнулся с проблемой, связанной с неправильным ограничением внешнего ключа. Я попробовал файл миграции, полный текст ошибки приложен ниже.

Ошибка

  SQLSTATE[HY000]: General error: 1005 Can't create table `dbwarehourse`.`order_products` (errno: 150 "Foreign key constraint is incorrectly formed") (Connection: mysql, SQL: alter table `order_products` add constraint `order_products_order_id_foreign` foreign key (`order_id`) references `orders` (`id`))

Таблица продуктов

  Schema::create('products', function (Blueprint $table) {
            $table->id();
            $table->string('productcode');
          

            $table->foreignId('category_id')->constrained('categories');
            $table->string('productname');
            $table->decimal('price', 8, 2);
            $table->integer('stock');
            $table->integer('stock_level'); // Add this line
            $table->boolean('status')->default(0);

            $table->timestamps();
        });

Стол заказов

  Schema::create('orders', function (Blueprint $table) {
            $table->id();
            $table->interger('invoicenumber');
            $table->foreignId('client_id')->constrained('clients');
            $table->decimal('total_amount', 10, 2);
            $table->boolean('status')->default(0);
            $table->timestamps();
        });

Заказ_продукты

        Schema::create('order_products', function (Blueprint $table) {
            $table->id();
            $table->foreignId('product_id')->constrained('products');
            $table->foreignId('order_id')->constrained('orders');
            $table->integer('quantity');
            $table->decimal('price', 8, 2);
            $table->timestamps();

        });

Посмотрите внимательно на сообщение об ошибке. В частности, посмотрите на SQL, который он выдал.

Ramza 19.07.2024 15:42

запустите SHOW ENGINE INNODB STATUS и посмотрите раздел ПОСЛЕДНЯЯ ОШИБКА ВНЕШНЕГО КЛЮЧА

kris gjika 19.07.2024 17:30
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
2
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка, которую вы получаете, связана с назначением order_id external_key в order_products таблице.

Хотя синтаксис правильный, но все же могут возникнуть некоторые проблемы с соглашением об именах. Я также сталкивался с подобной ситуацией в своем собственном случае. И я нашел следующие решения полезными.

Поскольку ошибка говорит..

(ошибка: 150 «Ограничение внешнего ключа сформировано неправильно») (Соединение: mysql, SQL: изменить таблицу order_products добавить ограничение order_products_order_id_foreign ссылки на внешний ключ (order_id) orders (id))

Поэтому избегайте использования метода constrained() и вместо этого явно определите Foreign Key Constraints вот так в схеме Order_products.

     Schema::create('order_products', function (Blueprint $table) {
            $table->id();
            $table->foreignId('product_id')->constrained('products');

            $table->unsignedBigInteger('order_id');
            //define foreign key Constraint
            $table->foreign('order_id')->references('id')->on('orders')->onDelete('cascade');
            
            $table->integer('quantity');
            $table->decimal('price', 8, 2);
            $table->timestamps();

      });

Попробуйте это, я думаю, это решит проблему. Если у вас возникнут какие-либо проблемы, дайте мне знать.

Сценарий 2 :-

Другая потенциальная причина этой ошибки заключается в том, что вы создали файл миграции order_products до файла миграции orders. В том случае, когда вы запускаете php artisan migrate, происходит это столкновение. Потому что столбцы foreign-key (в данном случае order_id) таблицы Order_products создаются до создания фактической таблицы orders, на которую они ссылаются.

Если это так, вам необходимо поделиться ими с именем файла миграции. Только тогда мы сможем предложить вам правильные решения.

спасибооооооооооооооооооооооооооооооо.......... ‌​......

Vasantha Kalyani 20.07.2024 09:26

Другие вопросы по теме