Laravel 当涉及关系时,如何正确删除项目?

Laravel 当涉及关系时,如何正确删除项目?,laravel,vue.js,Laravel,Vue.js,这是关于我要做什么的一些背景,我正在制作一个带有调查的学校调查系统,这些调查有可以添加到某个调查中的部分,这些部分有属于它的问题,例如一个部分可以是校园,该部分中的问题与学校校园相关 我正试图删除一个部分,并删除所有属于该部分的问题,我的代码完成了一半。这些问题有不同的“类别”,即回答类型,如是或否、排名、文本,最后是多项选择题。对于多项选择题,它们与问题选项有关系 如果一个部分里面没有选择题,那么它会删除该部分和所有的问题,但是如果有,那么我会得到这个错误 SQLSTATE[23000]:完整

这是关于我要做什么的一些背景,我正在制作一个带有调查的学校调查系统,这些调查有可以添加到某个调查中的部分,这些部分有属于它的问题,例如一个部分可以是校园,该部分中的问题与学校校园相关

我正试图删除一个部分,并删除所有属于该部分的问题,我的代码完成了一半。这些问题有不同的“类别”,即回答类型,如是或否、排名、文本,最后是多项选择题。对于多项选择题,它们与问题选项有关系

如果一个部分里面没有选择题,那么它会删除该部分和所有的问题,但是如果有,那么我会得到这个错误

SQLSTATE[23000]:完整性约束冲突:1451无法删除或更新父行:外键约束失败(unadeca_system.survey_question_options,constraint survey_question_options_survey_question_id_foreign key(survey_question_id)引用` survey_questions(id))(SQL:从survey_questions.survey_section_id=1且survey_questions.survey_section_id不为空的survey_questions中删除)

关系是这样的

部分>hasMany>问题>hasMany>问题选项

我在节模型中这样删除

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 function destroy($id)
{
    DB::beginTransaction();
    $preg = SurveyQuestion::findOrFail($id);
    $preg->surveyQuestionOption()->delete();
    $preg->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();
    $section = SurveySection::findOrFail($id);     
    $section->questions()->delete();
    $section->delete();
    DB::commit();

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

    return back();
}

如何修复此错误以删除所有问题,而不考虑其是否为多项选择?

您正在对关系对象(非雄辩模型)调用
delete

$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();
    });
});
static::deleting(function ($question) {
    $question->surveyQuestionOptions->each(function ($option) {
        $option->delete();
    });
});
SurveyQuestion@boot

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

尝试级联删除。您可以在迁移级别执行此操作,或者如果您想在模型中执行此操作,您应该找到记录的所有子项,删除它们,然后可以删除父项。@Bahman理想情况下,我想从模型中执行此操作,我编辑了此问题以添加其他模型删除方法,如下所示well@Bahman我目前将我的数据库保存到casca取消删除但它不起作用失败时您要调用哪个端点?