我正在使用 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。但我能够成功删除订单记录本身,但如果我删除计划记录,它将删除详细信息,而详细信息将删除订单记录。只是不起作用。
有人可以帮我吗。
谢谢你。
订单记录没有被删除,因为在启动的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);
});
参考:删除模型