laravel-json-api / laravel

JSON:API for Laravel applications

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

eager loading problem

veneliniliev opened this issue · comments

I have a problem in the following case and with eager loading:

two fields with the same type:

HasOne::make('metric')->type('inventory-metrics'),
HasOne::make('metric-service', 'metricService')->type('inventory-metrics'),

in model:

public function metric(): HasOne
{
return $this->hasOne(Metric::class, 'id', 'metric_id');
}
public function metricService(): HasOne
{
return $this->hasOne(Metric::class, 'id', 'metric_service_id');
}

in AppServiceProvider I have Model::preventLazyLoading()

I include both relations in the query!

include=metric,metric-service

and throw an exception: Attempted to lazy load [metric] on model

Originally posted by @veneliniliev in #263 (comment)

Can you confirm what your controller action looks like? Or is there no controller action because you're using one from this package (without any modifications).

The reason I ask is this is all unit tested so if the data is being loaded from the database via this package, it should be working. If you're doing any custom loading and then passing it to a response class, then it's possible there'd be an eager load problem - because the encoding doesn't do any loading, it expects the data to already be loaded.

Can you confirm what your controller action looks like? Or is there no controller action because you're using one from this package (without any modifications).

The reason I ask is this is all unit tested so if the data is being loaded from the database via this package, it should be working. If you're doing any custom loading and then passing it to a response class, then it's possible there'd be an eager load problem - because the encoding doesn't do any loading, it expects the data to already be loaded.

yes, i use default controller from package.

There's not much for me to go on here - the eager loading is tested, so either the tests are missing something or there's something specific about your scenario.

I'm a bit unsure where to start. What does the full stack trace of the exception look like?

There's not much for me to go on here - the eager loading is tested, so either the tests are missing something or there's something specific about your scenario.

I'm a bit unsure where to start. What does the full stack trace of the exception look like?

[2023-11-09 08:11:28] local.ERROR: Unable to encode compound document. See previous exception for cause of failure. {"userId":1,"exception":"[object] (LogicException(code: 0): Unable to encode compound document. See previous exception for cause of failure. at /app/vendor/laravel-json-api/encoder-neomerx/src/Document.php:201)
[stacktrace]
#0 /app/vendor/laravel-json-api/core/src/Core/Responses/Internal/ResourceCollectionResponse.php(88): LaravelJsonApi\Encoder\Neomerx\Document->toJson()
#1 /app/vendor/laravel-json-api/core/src/Core/Responses/DataResponse.php(120): LaravelJsonApi\Core\Responses\Internal\ResourceCollectionResponse->toResponse()
#2 /app/vendor/laravel/framework/src/Illuminate/Routing/Router.php(893): LaravelJsonApi\Core\Responses\DataResponse->toResponse()
#3 /app/vendor/laravel/framework/src/Illuminate/Routing/Router.php(878): Illuminate\Routing\Router::toResponse()
#4 /app/vendor/laravel/framework/src/Illuminate/Routing/Router.php(798): Illuminate\Routing\Router->prepareResponse()
#5 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(141): Illuminate\Routing\Router->Illuminate\Routing\{closure}()
#6 /app/vendor/laravel-json-api/laravel/src/Http/Middleware/BootJsonApi.php(105): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#7 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): LaravelJsonApi\Laravel\Http\Middleware\BootJsonApi->handle()
#8 /app/app/Http/Middleware/CryptMiddleware.php(49): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#9 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): App\Http\Middleware\CryptMiddleware->handle()
#10 /app/app/Http/Middleware/ActivityLogBatchMiddleware.php(38): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#11 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): App\Http\Middleware\ActivityLogBatchMiddleware->handle()
#12 /app/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#13 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Routing\Middleware\SubstituteBindings->handle()
#14 /app/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(159): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#15 /app/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(125): Illuminate\Routing\Middleware\ThrottleRequests->handleRequest()
#16 /app/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(87): Illuminate\Routing\Middleware\ThrottleRequests->handleRequestUsingNamedLimiter()
#17 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Routing\Middleware\ThrottleRequests->handle()
#18 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(116): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#19 /app/vendor/laravel/framework/src/Illuminate/Routing/Router.php(798): Illuminate\Pipeline\Pipeline->then()
#20 /app/vendor/laravel/framework/src/Illuminate/Routing/Router.php(777): Illuminate\Routing\Router->runRouteWithinStack()
#21 /app/vendor/laravel/framework/src/Illuminate/Routing/Router.php(741): Illuminate\Routing\Router->runRoute()
#22 /app/vendor/laravel/framework/src/Illuminate/Routing/Router.php(730): Illuminate\Routing\Router->dispatchToRoute()
#23 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\Routing\Router->dispatch()
#24 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(141): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}()
#25 /app/vendor/badinansoft/nova-language-switch/src/Http/Middleware/LanguageSwitch.php(29): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#26 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Badinansoft\LanguageSwitch\Http\Middleware\LanguageSwitch->handle()
#27 /app/vendor/laravel/nova/src/Http/Middleware/ServeNova.php(23): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#28 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Laravel\Nova\Http\Middleware\ServeNova->handle()
#29 /app/vendor/orkhanahmadov/laravel-accept-language-middleware/src/Middleware.php(24): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#30 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Orkhanahmadov\LaravelAcceptLanguageMiddleware\Middleware->handle()
#31 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#32 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#33 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle()
#34 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#35 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#36 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\TrimStrings->handle()
#37 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#38 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle()
#39 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#40 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle()
#41 /app/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#42 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Http\Middleware\HandleCors->handle()
#43 /app/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#44 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Http\Middleware\TrustProxies->handle()
#45 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(116): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#46 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\Pipeline\Pipeline->then()
#47 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter()
#48 /app/public/index.php(65): Illuminate\Foundation\Http\Kernel->handle()
#49 {main}

[previous exception] [object] (Illuminate\Database\LazyLoadingViolationException(code: 0): Attempted to lazy load [metric] on model [App\Models\Inventory\Inventory] but lazy loading is disabled. at /app/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php:564)
[stacktrace]
#0 /app/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php(523): Illuminate\Database\Eloquent\Model->handleLazyLoadingViolation()
#1 /app/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php(454): Illuminate\Database\Eloquent\Model->getRelationValue()
#2 /app/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(2226): Illuminate\Database\Eloquent\Model->getAttribute()
#3 /app/vendor/laravel-json-api/core/src/Core/Resources/Relation.php(343): Illuminate\Database\Eloquent\Model->__get()
#4 /app/vendor/laravel-json-api/eloquent/src/Resources/Relation.php(112): LaravelJsonApi\Core\Resources\Relation->value()
#5 /app/vendor/laravel-json-api/core/src/Core/Resources/Relation.php(156): LaravelJsonApi\Eloquent\Resources\Relation->value()
#6 /app/vendor/laravel-json-api/encoder-neomerx/src/Schema/Relation.php(93): LaravelJsonApi\Core\Resources\Relation->data()
#7 /app/vendor/laravel-json-api/encoder-neomerx/src/Schema/Relation.php(116): LaravelJsonApi\Encoder\Neomerx\Schema\Relation->data()
#8 /app/vendor/laravel-json-api/encoder-neomerx/src/Schema/Relationships.php(111): LaravelJsonApi\Encoder\Neomerx\Schema\Relation->toArray()
#9 /app/vendor/laravel-json-api/neomerx-json-api/src/Parser/IdentifierAndResource.php(192): LaravelJsonApi\Encoder\Neomerx\Schema\Relationships->getIterator()
#10 /app/vendor/laravel-json-api/neomerx-json-api/src/Representation/FieldSetFilter.php(117): Neomerx\JsonApi\Parser\IdentifierAndResource->getRelationships()
#11 /app/vendor/laravel-json-api/neomerx-json-api/src/Representation/FieldSetFilter.php(70): Neomerx\JsonApi\Representation\FieldSetFilter->filterFields()
#12 /app/vendor/laravel-json-api/neomerx-json-api/src/Representation/DocumentWriter.php(189): Neomerx\JsonApi\Representation\FieldSetFilter->getRelationships()
#13 /app/vendor/laravel-json-api/neomerx-json-api/src/Representation/DocumentWriter.php(279): Neomerx\JsonApi\Representation\DocumentWriter->getRelationshipsRepresentation()
#14 /app/vendor/laravel-json-api/neomerx-json-api/src/Representation/DocumentWriter.php(68): Neomerx\JsonApi\Representation\DocumentWriter->getResourceRepresentation()
#15 /app/vendor/laravel-json-api/neomerx-json-api/src/Encoder/Encoder.php(198): Neomerx\JsonApi\Representation\DocumentWriter->addResourceToData()
#16 /app/vendor/laravel-json-api/neomerx-json-api/src/Encoder/Encoder.php(106): Neomerx\JsonApi\Encoder\Encoder->encodeDataToArray()
#17 /app/vendor/laravel-json-api/encoder-neomerx/src/CompoundDocument.php(60): Neomerx\JsonApi\Encoder\Encoder->encodeData()
#18 /app/vendor/laravel-json-api/encoder-neomerx/src/Document.php(199): LaravelJsonApi\Encoder\Neomerx\CompoundDocument->encode()
#19 /app/vendor/laravel-json-api/core/src/Core/Responses/Internal/ResourceCollectionResponse.php(88): LaravelJsonApi\Encoder\Neomerx\Document->toJson()
#20 /app/vendor/laravel-json-api/core/src/Core/Responses/DataResponse.php(120): LaravelJsonApi\Core\Responses\Internal\ResourceCollectionResponse->toResponse()
#21 /app/vendor/laravel/framework/src/Illuminate/Routing/Router.php(893): LaravelJsonApi\Core\Responses\DataResponse->toResponse()
#22 /app/vendor/laravel/framework/src/Illuminate/Routing/Router.php(878): Illuminate\Routing\Router::toResponse()
#23 /app/vendor/laravel/framework/src/Illuminate/Routing/Router.php(798): Illuminate\Routing\Router->prepareResponse()
#24 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(141): Illuminate\Routing\Router->Illuminate\Routing\{closure}()
#25 /app/vendor/laravel-json-api/laravel/src/Http/Middleware/BootJsonApi.php(105): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#26 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): LaravelJsonApi\Laravel\Http\Middleware\BootJsonApi->handle()
#27 /app/app/Http/Middleware/CryptMiddleware.php(49): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#28 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): App\Http\Middleware\CryptMiddleware->handle()
#29 /app/app/Http/Middleware/ActivityLogBatchMiddleware.php(38): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#30 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): App\Http\Middleware\ActivityLogBatchMiddleware->handle()
#31 /app/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#32 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Routing\Middleware\SubstituteBindings->handle()
#33 /app/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(159): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#34 /app/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(125): Illuminate\Routing\Middleware\ThrottleRequests->handleRequest()
#35 /app/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(87): Illuminate\Routing\Middleware\ThrottleRequests->handleRequestUsingNamedLimiter()
#36 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Routing\Middleware\ThrottleRequests->handle()
#37 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(116): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#38 /app/vendor/laravel/framework/src/Illuminate/Routing/Router.php(798): Illuminate\Pipeline\Pipeline->then()
#39 /app/vendor/laravel/framework/src/Illuminate/Routing/Router.php(777): Illuminate\Routing\Router->runRouteWithinStack()
#40 /app/vendor/laravel/framework/src/Illuminate/Routing/Router.php(741): Illuminate\Routing\Router->runRoute()
#41 /app/vendor/laravel/framework/src/Illuminate/Routing/Router.php(730): Illuminate\Routing\Router->dispatchToRoute()
#42 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\Routing\Router->dispatch()
#43 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(141): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}()
#44 /app/vendor/badinansoft/nova-language-switch/src/Http/Middleware/LanguageSwitch.php(29): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#45 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Badinansoft\LanguageSwitch\Http\Middleware\LanguageSwitch->handle()
#46 /app/vendor/laravel/nova/src/Http/Middleware/ServeNova.php(23): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#47 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Laravel\Nova\Http\Middleware\ServeNova->handle()
#48 /app/vendor/orkhanahmadov/laravel-accept-language-middleware/src/Middleware.php(24): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#49 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Orkhanahmadov\LaravelAcceptLanguageMiddleware\Middleware->handle()
#50 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#51 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#52 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle()
#53 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#54 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
#55 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\TrimStrings->handle()
#56 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#57 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle()
#58 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(99): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#59 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle()
#60 /app/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#61 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Http\Middleware\HandleCors->handle()
#62 /app/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#63 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\Http\Middleware\TrustProxies->handle()
#64 /app/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(116): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
#65 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\Pipeline\Pipeline->then()
#66 /app/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter()
#67 /app/public/index.php(65): Illuminate\Foundation\Http\Kernel->handle()
#68 {main}
"}

Hi! So I think I've got some clarity one what this is, it's highly likely to be incredibly difficult to fix. However, good to have it in the backlog.

If my suspicions are correct, it is to do with the fact that both relationships return the same model.

What's the full include path that you're using when this error is triggered?

that's right. the same model is returned.
no matter what is in the include... if i include both it breaks.

Can you provide some example include paths? Need them to confirm whether my suspicion is correct.

Can you provide some example include paths? Need them to confirm whether my suspicion is correct.

include=categories,metric,metric-service,brand,currency,stocks.location