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

时间:2018-12-19 22:30:51

标签: laravel laravel-5 foreign-keys sql-delete

在我的数据库中,我的用户包含外键,然后当我想在Laravel App中删除商店时,可以这样做,但是对于属性“ 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');
}

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

2 个答案:

答案 0 :(得分:4)

我认为错误在于您建立关系的方式。

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

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

stores

Store.php

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

User.php

这与您的级联选项一起意味着,每当从系统中删除用户时,您都希望删除其存储。删除商店后,用户将没有商店,但该用户仍然存在。

答案 1 :(得分:0)

尝试交换关系

在您的User.php中

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

在您的Store.php中

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