删除包含外键的字段,而不删除该字段包含LARAVEL的所有项目

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除包含外键的字段,而不删除该字段包含LARAVEL的所有项目相关的知识,希望对你有一定的参考价值。

在我的数据库中,我有包含外键的用户,然后当我想在我的Laravel应用程序中删除一个商店时,我可以这样做但是对于属性“delete('cascade)”,商店包含的所有项目都将被删除。

我想删除任何一个字段,但不删除与用户有关系的所有项目。

例如:在我的应用程序中,我可以创建用户,但每个用户都有一个商店,这是我的外键,现在......我可以在我的应用程序中删除商店,但是如果我删除了商店,那么用户也会被删除。

Schema::table('users', function(Blueprint $table){
        $table->engine = 'InnoDB';
        $table->unsignedInteger('store_id')->nullable()->after('direccion');
        $table->foreign('store_id')->references('id')->on('stores')->onDelete('cascade');
    });

在我的商店模型中:

public function user()
{
    return $this->hasOne('AppUser');
}

在我的用户模型中

public function store()
{
    return $this->belongsTo('AppStore');
}

对于我拥有的其他元素也是如此:例如:我可以创建票证,票证包含外键,例如:user_id和status_id。我认为Store元素会出现同样的问题,对吧?我需要帮助。

门票型号:

public function user()
{
    return $this->belongsTo(User::class, 'usuario_id', 'id');
}

public function status()
{
    return $this->belongsTo('AppStatus');
}

我想保留元素,在这种情况下,如果我想删除商店,我不想删除具有该外键的用户。在票证的情况下,我希望能够删除用户,但保持票证保存,反之亦然。

答案

在我看来,错误在于你建立关系的方式。

因此,如果用户有一个商店,那么你应该在你的user_id表中添加一个stores,而不是相反。

那你的模型应该是这样的:

Store.php

public function user()
{
    return $this->belongsTo(User::class);
}

和你的User.php

public function store()
{
    return $this->hasOne(Store::class);
}

使用级联选项意味着无论何时从系统中删除用户,您都希望删除其存储。当商店被删除时,用户将没有商店,但用户仍然存在。

另一答案

尝试交换关系

在你的User.php中

public function store()
{
    return $this->hasOne('AppStore');
}

在你的Store.php中

public function user()
{
    return $this->belongsTo('AppUser');
}

以上是关于删除包含外键的字段,而不删除该字段包含LARAVEL的所有项目的主要内容,如果未能解决你的问题,请参考以下文章

Django REST Framework - 发布包含自然键的外键字段?

sql server解决无法删除修改拥有外键约束的表或表的记录字段

11.21

关于mysql(Navicat premium软件中) 外键设置中“删除”和“更新”选项详解

8. EF Core 外键的删除模式

谈谈mysql的主键和外键