【问题标题】:Set Foreign Key to 'NULL' When delete Relationship in Laravel在 Laravel 中删除关系时将外键设置为“NULL”
【发布时间】:2020-12-02 12:23:02
【问题描述】:

我的问题与 Laravel 有关,我有 product 模型和 categories。他们与category_id 有关系,作为product 表的外键,我的问题是,我需要删除一个类别时,这个category_id 相关字段是NULL,我的意思是,有一个Laravel 方法可以做它?没有在migration.

这是我的类别模型:

public function products()
{
    return $this->hasMany('App\Models\Product');
}

这是我的产品型号:

    public function category()
{
    return $this->belongsTo('App\Models\Category')->withDefault(function ($data) {
        foreach($data->getFillable() as $dt){
            $data[$dt] = __('Deleted');
        }
    });
}

【问题讨论】:

  • 当你现在删除一个类别会发生什么?
  • 该类别已删除,但在我的产品表中,category_id 仍然存在!我应该是 NULL
  • 那么,没有设置外键?更有理由进行迁移更新。
  • 外键在我的产品表中,但当我删除一个类别时应该为空。

标签: mysql laravel model-view-controller eloquent


【解决方案1】:

使用助手的更短方式:

Schema::table('products', function(Blueprint $table) {
    $table->foreignId('category_id')->nullable()->constrained()->on('categories')->nullOnDelete();
});

【讨论】:

    【解决方案2】:

    编辑:

    我的意思是它可能是可能的,但我不建议这样做。从理论上讲,您可以进行数据库查询,以获取具有刚刚删除的类别的 category_id 的所有产品,然后只要您的列包含空值,就将它们更新为空。每当您删除一个类别时,您只需调用它(或它的一些变体)。根据您正在执行此操作的表的大小,这可能会对性能产生重大影响。

    即。 (使用模型):

    Products::where('category_id', '=', $id_i_deleted)->update(['category_id' => null]);
    

    或(使用数据库):

    DB::table('products')->where('category_id', '=', $id_i_deleted)->update(['category_id' => null]);
    

    但我强烈建议你硬着头皮改变你的表结构。从长远来看,它会为您省去无穷无尽的麻烦。

    原文:

    是的,这绝对是可能的!如果您希望外键允许为空值,请按照以下方式设置外键:

    Schema::table('products', function(Blueprint $table) {
        $table->integer('category_id')->unsigned()->nullable();
        $table->foreign('category_id')->references('id')->on('categories')->onDelete('set null');
    });
    

    【讨论】:

    • 感谢您的回答,但还有其他方法吗?
    • @calebesantana 我提供了一个替代解决方案,但我仍然建议创建一个迁移来解决这个问题。希望对您有所帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 2019-12-02
    • 2019-10-29
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    相关资源
    最近更新 更多