使用子项的子项中的数据删除父项时的Laravel外键约束错误

时间:2018-05-29 04:59:38

标签: php laravel laravel-5 eloquent foreign-keys

所以这就是如何设置的。

  • 步骤有类别
  • 类别有一个部分
  • A Section有多个问题

想到我的所有模型文件中都有效,但不幸的是我的外键遇到了完整性错误。

我的模型被命名为:

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 :(得分:1)

看起来您的问题是由于您的表,因此请确保在迁移中声明外键时,您要添加应删除/更新这些行的操作。例如:

在你的step_categories上输入外键' step_id'应该是这样的:

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

您应该对所有表格执行相同的操作