Ошибки ограничения внешнего ключа Laravel при удалении Parent с данными в child of child - PullRequest
0 голосов
/ 29 мая 2018

Вот как это настроено.

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

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

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

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');
    }
}

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

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

1 Ответ

0 голосов
/ 29 мая 2018

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

В ваших step_categories внешний ключ 'step_id' должен выглядеть следующим образом:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...