Laravel 10 删除父项后无法软删除相关记录

问题描述 投票:0回答:1

我正在使用 Laravel 10,并且在删除父记录后软删除子记录时遇到问题。我尝试使用模型中的启动来删除相关记录,但不起作用。

这是型号代码:

规划.php

    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Factories\HasFactory;
        use Illuminate\Database\Eloquent\Model;
        use Illuminate\Database\Eloquent\SoftDeletes;
    
    class Planning extends Model
    {
        use HasFactory;
        use SoftDeletes;
    
       protected static function booted(): void
        {
            static::deleted(function ($planning) {
                $planning->planningDetail()->delete();
            });
        }
    
       public function planningDetail(){
            return $this->hasMany(PlanningDetail::class, 'planning_id', 'id');
        }
    }

PlanningDetail.php

<?php

namespace App\Models;

use App\Traits\UserRecords;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class PlanningDetail extends Model
{
    use HasFactory;
    use SoftDeletes;
    use UserRecords;

   protected static function booted(): void
    {
        static::deleted(function ($planningDetail) {
            $planningDetail->orderRecord()->delete();
        });
    }

   public function orderRecord()
     {
       return $this->hasOne(OrderRecord::class, 'planning_detail_id', 'id');
     }
}

订单记录.php


class OrderRecord extends Model
{
    use HasFactory;
    use SoftDeletes;


    public function planningDetail()
    {
        return $this->belongsTo(PlanningDetail::class, 'planning_detail_id', 'id');
    }

所以我这里有 3 个模型。 Planning 和 orderRecord 与 Planning_detail 相关,其中 Planning 具有许多 Planning_detail,而 orderRecord 具有 Planning_detail 之一。所以我尝试软删除计划,在启动时它将删除与计划相关的记录,即planning_detail,它执行了软删除planning_detail,其按预期工作。

删除planning_detail后,模型中planning_detail会在删除planning_detail后删除orderRecord。在引导中,如果 Planning_detail 删除,它将删除订单记录,但由于某种原因,引导无法工作。它只是不会删除相关数据orderRecord。但我能够成功删除订单记录本身,但如果我删除计划记录,它将删除详细信息,而详细信息将删除订单记录。只是不起作用。

有人可以帮我吗。

谢谢你。

php laravel relation laravel-10 soft-delete
1个回答
0
投票

订单记录没有被删除,因为在启动的Planning上,PlanningDetail是通过批量删除语句删除的,所以PlanningDetail上的删除事件不会被调度。

如果要调度其已删除事件,则必须单独删除 PlanningDetail 模型。您可以通过修改规划模型上已删除的事件来做到这一点

static::deleted(function ($planning) {
    $details = $planning->planningDetail;

    foreach ($details as $detail) {
        $detail->delete();
    }
});

或者你可以使用销毁功能

static::deleted(function ($planning) {
    $detailsId = $planning->planningDetail->pluck('id');

    PlanningDetail::destroy($detailsId);
});

参考:删除模型

© www.soinside.com 2019 - 2024. All rights reserved.