在Laravel中删除关系时将外键设置为“ NULL”

问题描述

我的问题与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(只要您的列中包含空值)即可。每当您删除类别时,您都可以简单地调用它(或它的某种变体)。根据您要执行的表的大小,这可能会对性能产生重大影响。

即。 (使用模型):

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

或(使用DB):

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');
});

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...