Как правильно удалить элементы, когда отношения связаны? - PullRequest
0 голосов
/ 21 октября 2019

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

Я пытаюсь удалить раздел и удалить все вопросы, относящиеся к этому разделу, и мой код делает это наполовину. Вопросы имеют разные «Категории», которые представляют собой тип ответа, например, да или нет, рейтинг, текст и, наконец, вопрос с несколькими вариантами ответов. Для вопросов с множественным выбором они имеют отношение к вариантам вопроса.

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

SQLSTATE [23000]: Нарушение ограничения целостности: 1451 Невозможно удалить или обновить родительскую строку: ограничение внешнего ключа не выполнено (unadeca_system.survey_question_options, CONSTRAINT survey_question_options_survey_question_id_foreign FOREIGN KEY (survey_question_id) REFERENCES `survey_questions_id_is_istion_tiontion.sure_section_section_section_section_section_section_section_section_section_section_section_section_section_section_екции) (SQL)и survey_questions.survey_section_id не является нулевым)

Отношения имеют следующий вид

Разделы> hasMany> Вопросы> hasMany> QuestionOptions

IУдаляю вот так в разделе модели

public static function boot() {
    parent::boot();
    // when you are deleting a SurveySection, also delete all related questions
    static::deleting(function($section){
        $section->questions->each(function($question) {
            $question->surveyQuestionOption()->delete();
            $question->delete();
        });
    });
}

В разделе контроллера

public function destroy($id)
{
    DB::beginTransaction();
    $section = SurveySection::findOrFail($id);     
    $section->questions()->delete();
    $section->delete();
    DB::commit();

    return back();
}

Вот так я удаляю вопросы из модели

public static function boot() {
    parent::boot();
    // when you are deleting a SurveyQuestion, also delete all related options
    static::deleting(function($question){
        $question->surveyQuestionOption->each(function($option) {
            $option->delete();
        });
    });
}

Вот так я удаляю вопросы в контроллере

public function destroy($id)
{
    DB::beginTransaction();
    $preg = SurveyQuestion::findOrFail($id);
    $preg->surveyQuestionOption()->delete();
    $preg->delete();
    DB::commit();

    return back();
}

Как я могу исправить эту ошибку, чтобы удалить все вопросы, независимо от того, есть ли у них несколько вариантов выбора?

1 Ответ

1 голос
/ 22 октября 2019

Вы вызываете delete для объекта Relationship, а не для Eloquent Model:

$question->surveyQuestionOption()->delete();

В конечном итоге вызовется метод delete базового построителя запросов для непосредственного выполнения запроса на удаление;он не вызывает метод delete в модели, который запускает события модели.

SectionController@destroy:

$section = SurveySection::findOrFail($id);

$section->delete();

SurveySection@boot:

static::deleting(function ($section) {
    $section->surveyQuestions->each(function ($question) {
        $question->delete();
    });
});

SurveyQuestion@boot:

static::deleting(function ($question) {
    $question->surveyQuestionOptions->each(function ($option) {
        $option->delete();
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...