mikebronner / laravel-model-caching

Eloquent model-caching made easy.
MIT License
2.23k stars 212 forks source link

Eager-loaded polymorphic relationship error #383

Open A-Lawrence opened 3 years ago

A-Lawrence commented 3 years ago

Describe the bug

When eager-loading polymorphic relationships, the polymorphic relation appears to be ignored when retrieving from the cache.

The exception below, is raised:

Call to undefined method Admin\Models\Inventory::settings()

Eloquent Query

Scenario here is that we have SaleItems, with an associated Inventory. Each Inventory can have a polymorphic source (such as an Event).

This query then produces are an error:

        $orderItems = $orderItemQuery
            ->with([
                'saleItem.inventory.source.company',
                'saleItem.inventory.source.settings',
                'saleItem.inventory.source.stream',
                'saleItem.pricing',
                'saleItem.item'])
            ->latest()
            ->paginate($count);

It's as though the source part of the eager loaded relationship, for settings or stream, is not loaded (settings exists, stream does not so I'd expect a null return). The only reason that saleItem.inventory.source.company works is because Inventory has a company() relationship too, to scope to the current tenant.

The setup for the involved models, is as below - all of them extend an abstract Model which uses the Cachable trait.

class OrderItem extends Model {
    public function saleItem()
    {
        return $this->belongsTo(SaleItem::class);
    }
}

class SaleItem {
    public function inventory()
    {
        return $this->belongsTo(Inventory::class);
    }
}

class Inventory extends Model {
    public function company()
    {
        return $this->belongsTo(Company::class);
    }

    public function source()
    {
        return $this->morphTo('source', 'entity_type', 'entity_id');
    }
}

class Event extends Model {
    public function inventory(): MorphOne
    {
        return $this->morphOne(Inventory::class, 'inventory', 'entity_type', 'entity_id');
    }

    public function company()
    {
        return $this->belongsTo(Company::class);
    }

    public function settings()
    {
        return $this->hasOne(EventSetting::class)->withDefault();
    }

    public function stream()
    {
        return $this->hasOne(EventStream::class)->withDefault();
    }
}

Stack Trace https://flareapp.io/share/x7XgnRRP#F78

Environment

Edit: Potentially related to https://github.com/GeneaLabs/laravel-model-caching/issues/379 - I hadn't spotted this one before posting!

mikebronner commented 3 years ago

Hi @A-Lawrence, thanks for submitting this issue! I will try to get to it as soon as possible, which might be some time, as we re in the middle of moving. I welcome PRs with failing tests, as well as fixes, if you are able. :) Thanks!

markodobric commented 3 months ago

hey @mikebronner,

thank you for your great package!

but this issue still exists and represents blocker for fully usage, is there a plan to get this fixed?

thanks in advance.