Laravel - Удалить со всеми связями - PullRequest
0 голосов
/ 24 мая 2018

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

- A User user has multiple orders.
- An Order has multiple order items.
- Order Items belong to an order.
- A webshop belongs to a user and a webshop has One Main Setting.
- Main settings belongs to a webshop and has One address.
- Address belongs to main setting

Когда пользователь с идентификатором 1 удаляется.Все заказы, где user_id равен 1, также должны быть удалены, проблем нет.Но у заказа с user_id 1 также есть Много order_items.Например, этот конкретный заказ имеет идентификатор 3. Все элементы order_id с идентификатором order_id также должны быть удалены.И вот тут я столкнулся с этим вопросом.

Моя попытка

Пользователь удаляется при этом

$user = User::find($id);
$user->delete();

Отношение удаляется при этом:

$user->orders()->delete();

Но как мне удалить элементы заказа, связанные со всеми заказами, которые были удалены?Моя попытка была:

$user->orders()->orderitems()->delete();

Но, к сожалению, это не работает.Все отношения в моделях работают отлично.Таким образом, все свойства, которые можно использовать:

User
- Orders();
- Webshops();
Order
- Orderitems();
Webshop
- Mainsetting();
Mainsetting
- Address();

Как я могу выполнить вышеуказанное?

1 Ответ

0 голосов
/ 24 мая 2018

Если вы используете MySQL (или любую СУБД, которая поддерживает каскадирование), вы можете каскадно удалять на уровне базы данных.Если нет, вам придется обрабатывать его вручную на контроллере или с помощью функций прослушивания событий модели.См. документацию по миграции , детализирующую ограничения внешнего ключа.

Schema::create('order_items', function (Blueprint $table) {
    $table->increments('id');
    $table->unsignedInteger('order_id');
    $table->timestamps();

    $table->foreign('sell_order_id')
          ->references('id')
          ->on('orders')
          ->onDelete('cascade');
});

Примечание : Laravel поддерживает мягкое удаление из коробки,а также каскадное мягкое удаление, см. следующую статью https://laravel -news.com / cascading-soft-deletes-eloquent

...