Eloquent hasOneThrough withTrashed

У меня есть набор моделей продуктов со следующими отношениями:

ЗаказатьПродукт -> АккаунтПродукт -> Продукт

Модель OrderProduct принадлежит AccountProduct и имеет отношение hasOneThrough к продукту. Эти отношения работают нормально до тех пор, пока я не окажусь в ситуации, когда аккаунтПродукт и Продукт были обратимо удалены. Я все еще могу получить отношение через цепочку, но hasOneThrough не работает в этом сценарии.

public function accountProduct(): BelongsTo
{
    return $this->belongsTo(AccountProduct::class)
        ->withTrashed();
}

public function product(): HasOneThrough
{
    return $this->hasOneThrough(
        Product::class,
        AccountProduct::class,
        'id',
        'id',
        'account_product_id',
        'product_id'
    )->withTrashed();
}

Вывод:

echo $orderProduct->accountProduct->product->id

"1"


echo $orderProduct->product

"Trying to get property ID of a non object"

Есть ли изменение кода, которое я могу внести, чтобы заставить Eloquent возвращать отношение HasOneThrough, когда и accountProduct, и orderProduct мягко удаляются?


person RonnyKnoxville    schedule 28.02.2020    source источник


Ответы (1)


Laravel не имеет встроенной поддержки для этого.

Я создал для него пакет: https://github.com/staudenmeir/eloquent-has-many-deep

class OrderProduct extends Model
{
    use \Staudenmeir\EloquentHasManyDeep\HasRelationships;

    public function product(): HasOneThrough
    {
        return $this->hasOneDeep(
            Product::class,
            [AccountProduct::class],
            ['id', 'id'],
            ['account_product_id', 'product_id']
        )->withTrashed()
        ->withTrashed('account_products.deleted_at');
    }
}
person Jonas Staudenmeir    schedule 01.03.2020