Ошибки ограничения внешнего ключа Laravel при удалении родительского элемента с данными в дочернем элементе дочернего элемента

Итак, вот как это устроено.

  • У шага есть категория
  • Категория имеет раздел
  • В разделе есть несколько вопросов

Я мысль У меня все работало в моих файлах модели, но, к сожалению, я столкнулся с ошибкой целостности с моими внешними ключами.

Мои модели названы:

Step.php
StepCategory.php
StepSection.php
StepQuestion.php

Я не совсем уверен, как установить мои отношения «многие к одному» и что к чему принадлежит.

Имена таблиц моей базы данных следующие:

steps

step_categories

step_sections

step_questions

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

В моей таблице step_categories у меня есть столбец внешнего ключа с именем step_id.

В моей таблице step_sections у меня есть столбец внешнего ключа с именем category_id.

В моей таблице step_questions у меня есть столбец внешнего ключа с именем section_id.

Имя моего внешнего ключа в моей таблице step_categories - step_categories_step_id_foreign.

Имя моего внешнего ключа в моей таблице step_sections - step_sections_category_id_foreign.

Мое имя внешнего ключа в моей таблице step_questions еще не настроено, так как я еще не сделал эту часть сайта. В настоящее время я застрял на части разделов.

Моя функция destroy() в моем файле StepsController.php:

public function destroy($id)
{
    // Find the step by the ID
    $step = Step::find($id);

    // Find all the categories and delete them.
    $step->category()->delete();

    // Delete the step
    $step->delete();

    // Flash the Session
    Session::flash('success', 'The step has been successfully deleted.');

    // Return Redirect to the index page
    return redirect()->route('steps.index');
}

Вот как выглядят мои модели ... Это насколько я понял ... :(

Step.php

class Step extends Model
{
    // Tell the model what table to use
    protected $table = 'steps';

    // Define the relationship between steps and step categories
    public function category() {
        return $this->hasMany('App\StepCategory');
    }

}

StepCategory.php

class StepCategory extends Model
{
    // Tell the model what table to use
    protected $table = 'step_categories';

    // Define the relationship between step categories and steps
    public function step() {
        return $this->hasOne('App\Step', 'id', 'step_id');
    }

    // Define the relationship between steps categories and sections
    public function section() {
        return $this->hasMany('App\StepSection');
    }

}

и мой StepSection.php

class StepSection extends Model
{
    // Tell the model what table to use
    protected $table = 'step_sections';

    // Define the relationship between step sections and step categories
    public function category() {
        return $this->hasOne('App\StepCategory', 'id', 'category_id');
    }
}

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

Пока я могу удалить шаг, и он удалит категорию, если к категории не прикреплены разделы. Однако я не могу удалить шаг или категорию, если к ним прикреплены какие-либо разделы. : / Не знаю, что происходит.

Вы добавили каскад ondelete в свою миграцию для внешних ключей?

prit.patel 29.05.2018 07:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
1
1 767
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Похоже, ваша проблема связана с вашими таблицами, поэтому убедитесь, что когда вы объявляете внешний ключ в своих миграциях, вы добавляете то, что должно быть сделано при удалении / обновлении этих строк. Например:

На вашем step_categories внешний ключ step_id должен быть таким:

$table->foreign('step_id')->references('id')->on('step')->onDelete('cascade')->onUpdate('cascade');

Вы должны сделать то же самое со всеми своими таблицами

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