问题描述
我的问题与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');
});