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

问题描述 投票:0回答:2

在我的数据库中,我有包含外键的用户,然后当我想在我的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('App\User');
}

在我的用户模型中

public function store()
{
    return $this->belongsTo('App\Store');
}

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

门票型号:

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

public function status()
{
    return $this->belongsTo('App\Status');
}

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

laravel laravel-5 foreign-keys sql-delete
2个回答
4
投票

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

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

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

Store.php

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

和你的User.php

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

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


0
投票

尝试交换关系

在你的User.php中

public function store()
{
    return $this->hasOne('App\Store');
}

在你的Store.php中

public function user()
{
    return $this->belongsTo('App\User');
}
© www.soinside.com 2019 - 2024. All rights reserved.