【问题标题】:Laravel - Delete with all relationsLaravel - 删除所有关系
【发布时间】:2018-11-03 08:01:14
【问题描述】:

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

- 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();

我怎样才能做到以上几点?

【问题讨论】:

标签: laravel laravel-5 laravel-4 relationship


【解决方案1】:

如果您使用 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

【讨论】:

【解决方案2】:

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

那么您只需要删除订单,订单详细信息就会自动删除。

【讨论】:

  • 欢迎来到 SO 并感谢您的回答!我认为,如果您包含一个示例或解释您的建议为何有效,您的回答会对社区更有帮助。
猜你喜欢
  • 2018-05-19
  • 2020-03-16
  • 1970-01-01
  • 2016-05-01
  • 2015-05-15
  • 2020-08-02
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
相关资源
最近更新 更多