Удалить поле, содержащее внешний ключ, без удаления всех элементов, которые содержат поле LARAVEL - PullRequest
0 голосов
/ 20 декабря 2018

в моей БД у меня есть пользователи, которые содержат внешние ключи, тогда, когда я хочу удалить Магазин в моем приложении 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');
}

Я хочу сохранить элементы, в этом случае, если я хочу удалить магазин, я не хочу удалять пользователяу которого есть этот внешний ключ.А в случае билетов, я хочу иметь возможность удалить пользователя, но сохранить билет сохранить и наоборот.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Попробуйте обменяться отношениями

В вашем User.php

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

В вашем Store.php

public function user()
{
    return $this->belongsTo('App\User');
}
0 голосов
/ 20 декабря 2018

На мой взгляд, ошибка в том, как вы устанавливаете отношения.

Таким образом, если у пользователя есть один магазин, то вы должны добавить user_id в свою таблицу stores, а не наоборот.

Тогда ваши модели должны выглядеть следующим образом:

Store.php

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

и ваш User.php

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

Это с вашей опцией каскадирования будет означать, что при удалении пользователя из системы вы будетехочу, чтобы его магазин был удален.Когда хранилище будет удалено, у пользователя не будет хранилища, но пользователь все равно будет существовать.

...