【问题标题】:How to delete a record if it has a parent_id assigned?如果分配了 parent_id,如何删除记录?
【发布时间】:2021-05-07 13:46:42
【问题描述】:

我有一个类别表,允许通过 parent_id 获得子类别。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateCategoriesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->id();

            $table->string('name');
            $table->unsignedBigInteger('parent_id')->unsigned()->nullable();
            $table->string('slug');

            $table->foreign('parent_id')->references('id')->on('categories');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('categories');
    }
}

当我想删除一个子类别时,问题就来了。当我有外键时出现错误。

SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`doogmas`.`categories`, CONSTRAINT `categories_parent_id_foreign` FOREIGN KEY (`parent_id`) REFERENCES `categories` (`id`)) (SQL: delete from `categories` where `id` = 30)

即使我有外键,如何删除记录?

【问题讨论】:

  • 在此处添加onDelete('cascade') $table-&gt;foreign('parent_id')-&gt;references('id')-&gt;on('categories')-&gt;onDelete('cascade');
  • 我放 onDelete('cascade) 的问题是它也删除了它的父类,我只想删除子类(子类)。
  • onDelete('cascade') 不删除parent,如果parent已经删除则删除child。
  • 如果我删除具有 parent_id 的子类别,它会自动删除父(类别)。为什么会这样?我不明白...

标签: laravel


【解决方案1】:

尝试更改此设置

$table->foreign('parent_id')->references('id')->on('categories');

$table->foreign('parent_id')->references('id')->on('categories')->onDelete('cascade');

【讨论】:

  • 我放 onDelete('cascade) 的问题是它也删除了它的父类,我只想删除子类(子类)。
  • 尝试将cascade 更改为set null。如果可行,我将编辑我的答案
  • 如果我把 set null 它自动变成一个父对象,我需要简单地删除它。
【解决方案2】:

您可以设置删除一行时数据库如何处理它:

$table->foreign('parent_id')->references('id')->on('categories')->onDelete('cascade');

【讨论】:

  • 我放 onDelete('cascade) 的问题是它也删除了它的父类,我只想删除子类(子类)。
  • @Alberto 不,如果您删除父级,它会删除所有子级。如果你不想这样,你可以使用'set null'而不是'cascade',这样,如果你删除父母,孩子的父母id被设置为null
猜你喜欢
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多