如何在 Laravel 中恢复多层次深度相关模型

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

我正在 Laravel 中开发一个应用程序。 问题是,当我尝试恢复一个模型及其所有相关模型时,其中一些模型无法恢复。我想这是因为它们是多层次的深层相关的。 这是恢复项目的代码:

$contract = Contract::withTrashed()->findOrFail($id);
$contract->restore();

$contract->load(['acceptanceActs' => function ($query) {
   $query->withTrashed()->with('invoice');
}]);

foreach ($contract->acceptanceActs as $act) {
    $act->restore();

    if ($act->invoice) {
         $act->invoice->restore();
    }
}

return response()->json();

所以问题是相关的发票到验收行为没有恢复,但是合同和验收行为却恢复了。

这是我的模型: 合约:

/**
     * @return BelongsTo
     */
    public function client(): BelongsTo 
    {
        return $this->belongsTo(Client::class);
    }

    /**
     * @return HasMany
     */
    public function acceptanceActs(): HasMany
    {
        return $this->hasMany(AcceptanceAct::class);
    }

验收法案:

/**
     * @return BelongsTo
     */
    public function client(): BelongsTo
    {
        return $this->belongsTo(Client::class);
    }

    /**
     * @return HasOne
     */
    public function invoice(): HasOne
    {
        return $this->hasOne(Invoice::class);
    }

    /**
     * @return BelongsTo
     */
    public function contract(): BelongsTo
    {
        return $this->belongsTo(Contract::class);
    }

发票:

/**
     * @return BelongsTo
     */
    public function client(): BelongsTo 
    {
        return $this->belongsTo(Client::class);
    }

    /**
     * @return HasMany
     */
    public function items(): HasMany 
    {
        return $this->hasMany(InvoiceItem::class);
    }

    /**
     * @return BelongsTo
     */
    public function acceptanceAct(): BelongsTo 
    {
        return $this->belongsTo(AcceptanceAct::class);
    }

它们都使用软删除。

php laravel orm
1个回答
0
投票

A 会像这样编辑和简化你的代码,它应该可以正常工作。

$contract = Contract::withTrashed()->findOrFail($id);
$contract->restore();

$contract->acceptanceActs()
    ->withTrashed()
    ->get()
    ->each(function (AcceptanceAct $acceptanceAct) {
        $acceptanceAct->restore();

        $acceptanceAct->invoice()->withTrashed()->first()?->restore();
    });

return response()->json();
© www.soinside.com 2019 - 2024. All rights reserved.