首页 > 解决方案 > Laravel 在多级关系上触发软删除

问题描述

我正在尝试删除父记录,然后删除多级关系。

我有 3 个表:帐户 -> 服务 -> service_items

当我删除一个帐户时,我希望删除服务以及与该服务相关的所有 service_items。

在我的帐户模型中,我有以下代码

public function delete()
{
    $this->services()->delete();
    return parent::delete();
}

这是有效的,当帐户被删除时,所有相关服务都会被删除,但服务项目不会被删除。

我的服务模型中有以下功能

public function delete()
{
    $this->service_items()->delete();
    return parent::delete();
}

删除帐户时似乎没有触发此功能。我知道我可以遍历服务并删除每个 service_item 但我想知道是否有办法在服务模型中触发删除功能?

注意:如果我直接删除服务,则会删除 service_items

标签: laravelsoft-delete

解决方案


好的,所以这是解决方案。与其单独删除每个 service_item,不如使用 Laravel 的钩子的概念,在模型下声明 booted 方法

账户.php

<?php
class Account extends Model
{
    /**
     * The "booted" method of the model.
     *
     * @return void
     */
    protected static function booted()
    {
        static::deleted(function($account) {
            $account->services()->delete();
        });
    }

    /**
     * List of services associated with an account.
     */
    public function services()
    {
        // or you may have some other relationship
        return $this->hasMany('App\Service');
    }
}

服务.php

<?php
class Service extends Model
{
    /**
     * The "booted" method of the model.
     *
     * @return void
     */
    protected static function booted()
    {
        static::deleted(function($service) {
            $service->items()->delete();
        });
    }

    /**
     * List of items associated with an account.
     */
    public function items()
    {
        // or you may have some other relationship
        return $this->hasMany('App\ServiceItem');
    }
}

因此,每当您删除一个帐户时,它将删除与该帐户关联的所有服务,进而删除与每个服务关联的所有服务项目。


推荐阅读