删除包含外键的字段,而无需删除该字段包含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 and status_id。我认为这将是与商店元素相同的问题,对吗?我需要帮助。

票务型号:

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

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

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

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

那么您的模型应该是这样:

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

最新更新