Laravel - 删除所有关系

时间:2018-05-24 07:27:47

标签: laravel laravel-5 laravel-4 relationship

我有一个系统,用户连接到很多不同的表,这些表也连接到不同的表。当我从数据库中删除用户时,也应删除与该用户关联的每个关系。我项目的关系设置如下所示

- 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

当id为1的用户被删除时。 user_id等于1的所有订单也应该删除,没有问题。但user_id为1的订单也有很多order_items。例如,假设此特定订单的ID为3.还应删除order_id为3的所有order_items。这就是我遇到这个问题的地方。

我的尝试

通过执行此操作删除用户

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

通过执行以下操作删除关系:

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

但是如何删除与删除的所有订单相关联的订单商品?我的尝试是:

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

但不幸的是,这不起作用。 模型中的所有关系都非常好。所以可用的所有属性都是

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

我如何完成上述工作?

2 个答案:

答案 0 :(得分:4)

如果您使用的是MySQL(或任何支持级联的RDBMS),您可以在数据库级别级联删除。如果不是,则必须在控制器上或通过模型事件监听功能手动处理。 请参阅详细说明外键约束的documentation on migrations

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支持soft deletes开箱即用,以及级联软删除,请参阅以下文章https://laravel-news.com/cascading-soft-deletes-eloquent

答案 1 :(得分:0)

使用外键并在迁移中删除级联。

那么您只需要删除订单即可自动删除ordesr详细信息。