5 relationship laravel laravel-4 laravel-5
我有一个系统,其中用户连接到许多不同的表,这些表也连接到不同的表。当我从我的数据库中删除一个用户时,与该用户关联的每个关系也应该被删除。我的项目的关系设置看起来像这样
- 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
Run Code Online (Sandbox Code Playgroud)
当 id 为 1 的用户被删除时。也应该删除 user_id 等于 1 的所有订单,没有问题。但是user_id为1的订单也有很多order_items。因此,例如这个特定订单的 id 为 3。所有 order_id 为 3 的 order_items 也应该被删除。这就是我遇到这个问题的地方。
我的尝试
这样做会删除用户
$user = User::find($id);
$user->delete();
Run Code Online (Sandbox Code Playgroud)
通过这样做删除关系:
$user->orders()->delete();
Run Code Online (Sandbox Code Playgroud)
但是如何删除与所有被删除订单相关的订单项目?我的尝试是:
$user->orders()->orderitems()->delete();
Run Code Online (Sandbox Code Playgroud)
但不幸的是,这行不通。模型中的所有关系都运行良好。所以所有可用的属性都是
User
- Orders();
- Webshops();
Order
- Orderitems();
Webshop
- Mainsetting();
Mainsetting
- Address();
Run Code Online (Sandbox Code Playgroud)
我怎样才能完成上述任务?
如果您使用 MySQL(或任何支持级联的 RDBMS),您可以在数据库级别级联删除。如果没有,您必须在控制器上或通过模型事件侦听功能手动处理它。请参阅详细说明外键约束的迁移文档。
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');
});
Run Code Online (Sandbox Code Playgroud)
注:Laravel支持软删除开箱即用的以及级联软删除,请参见下面的文章https://laravel-news.com/cascading-soft-deletes-eloquent