Closed
Description
Describe the bug
I get a Return value of GeneaLabs\LaravelModelCaching\CacheKey::getValuesFromWhere() must be of the type string, array returned
error after the eloquent query called below.
Eloquent Query
Please provide the complete eloquent query that caused the bug, for example:
$model->where(function ($query) use ($store_id) {
$query->whereJsonContains('location', ['stores' => ['id' => $store_id]]);
})->count();
Stack Trace
[2020-03-26 07:49:46] local.ERROR: Return value of GeneaLabs\LaravelModelCaching\CacheKey::getValuesFromWhere() must be of the type string, array returned {"userId":1,"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalThrowableError(code: 0): Return value of GeneaLabs\\LaravelModelCaching\\CacheKey::getValuesFromWhere() must be of the type string, array returned at /private/var/www/project/vendor/genealabs/laravel-model-caching/src/CacheKey.php:167)
[stacktrace]
#0 /private/var/www/project/vendor/genealabs/laravel-model-caching/src/CacheKey.php(148): GeneaLabs\\LaravelModelCaching\\CacheKey->getValuesFromWhere(Array)
#1 /private/var/www/project/vendor/genealabs/laravel-model-caching/src/CacheKey.php(310): GeneaLabs\\LaravelModelCaching\\CacheKey->getValuesClause(Array)
#2 /private/var/www/project/vendor/genealabs/laravel-model-caching/src/CacheKey.php(200): GeneaLabs\\LaravelModelCaching\\CacheKey->getOtherClauses(Array)
#3 [internal function]: GeneaLabs\\LaravelModelCaching\\CacheKey->GeneaLabs\\LaravelModelCaching\\{closure}(NULL, Array)
#4 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Support/Collection.php(890): array_reduce(Array, Object(Closure), NULL)
#5 /private/var/www/project/vendor/genealabs/laravel-model-caching/src/CacheKey.php(203): Illuminate\\Support\\Collection->reduce(Object(Closure))
#6 /private/var/www/project/vendor/genealabs/laravel-model-caching/src/CacheKey.php(212): GeneaLabs\\LaravelModelCaching\\CacheKey->getWhereClauses(Array)
#7 /private/var/www/project/vendor/genealabs/laravel-model-caching/src/CacheKey.php(196): GeneaLabs\\LaravelModelCaching\\CacheKey->getNestedClauses(Array)
#8 [internal function]: GeneaLabs\\LaravelModelCaching\\CacheKey->GeneaLabs\\LaravelModelCaching\\{closure}('-crs.bu...', Array)
#9 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Support/Collection.php(890): array_reduce(Array, Object(Closure), NULL)
#10 /private/var/www/project/vendor/genealabs/laravel-model-caching/src/CacheKey.php(203): Illuminate\\Support\\Collection->reduce(Object(Closure))
#11 /private/var/www/project/vendor/genealabs/laravel-model-caching/src/CacheKey.php(42): GeneaLabs\\LaravelModelCaching\\CacheKey->getWhereClauses()
#12 /private/var/www/project/vendor/genealabs/laravel-model-caching/src/Traits/Caching.php(161): GeneaLabs\\LaravelModelCaching\\CacheKey->make(Array, NULL, '-count')
#13 /private/var/www/project/vendor/genealabs/laravel-model-caching/src/Traits/Buildable.php(27): GeneaLabs\\LaravelModelCaching\\CachedBuilder->makeCacheKey(Array, NULL, '-count')
#14 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php(23): GeneaLabs\\LaravelModelCaching\\CachedBuilder->count()
#15 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Relation.php(385): Illuminate\\Database\\Eloquent\\Relations\\Relation->forwardCallTo(Object(GeneaLabs\\LaravelModelCaching\\CachedBuilder), 'count', Array)
#16 /private/var/www/project/app/Models/User.php(457): Illuminate\\Database\\Eloquent\\Relations\\Relation->__call('count', Array)
#17 /private/var/www/project/app/Models/User.php(439): App\\Models\\User->hasAnyActivatedContract(1)
#18 /private/var/www/project/app/Listeners/GGG/RoleChangeSubscriber.php(178): App\\Models\\User->hasAnyActivatedContract(1)
#19 [internal function]: App\\Listeners\\GGG\\RoleChangeSubscriber->preContractPc540(Object(App\\Events\\GGG\\Contract\\GGGContractPc540PreEvent))
#20 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php(388): call_user_func_array(Array, Array)
#21 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php(218): Illuminate\\Events\\Dispatcher->Illuminate\\Events\\{closure}('App\\\\Events\\\\GGG\\\\...', Array)
#22 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php(261): Illuminate\\Events\\Dispatcher->dispatch('App\\\\Events\\\\GGG\\\\...')
#23 /private/var/www/project/app/Http/Controllers/Modules/PPPContract.php(1180): Illuminate\\Support\\Facades\\Facade::__callStatic('dispatch', Array)
#24 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php(261): App\\Http\\Controllers\\Modules\\PPPContract->PC540('ARCR', '4905e36b-855f-4...', Array, 'cool!')
#25 /private/var/www/project/app/Http/Controllers/Modules/ContractController.php(1145): Illuminate\\Support\\Facades\\Facade::__callStatic('PC540', Array)
#26 [internal function]: App\\Http\\Controllers\\Modules\\ContractController->PC540(Object(Illuminate\\Http\\Request))
#27 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): call_user_func_array(Array, Array)
#28 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\\Routing\\Controller->callAction('PC540', Array)
#29 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Routing/Route.php(219): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Http\\Controllers\\Modules\\ContractController), 'PC540')
#30 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Routing/Route.php(176): Illuminate\\Routing\\Route->runController()
#31 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Routing/Router.php(681): Illuminate\\Routing\\Route->run()
#32 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(130): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request))
#33 /private/var/www/project/vendor/spatie/laravel-permission/src/Middlewares/PermissionMiddleware.php(22): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#34 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Spatie\\Permission\\Middlewares\\PermissionMiddleware->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#35 /private/var/www/project/app/Http/Middleware/Authenticate.php(55): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#36 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): App\\Http\\Middleware\\Authenticate->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#37 /private/var/www/project/submodules/ppppppp/laravel-pkg-locale/src/pppppp/LaravelPkgLocale/Middleware/LocaleRedirect.php(62): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#38 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): pppppp\\LaravelPkgLocale\\Middleware\\LocaleRedirect->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#39 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(41): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#40 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#41 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(76): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#42 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#43 /private/var/www/project/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#44 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#45 /private/var/www/project/app/Http/Middleware/TenantStartSession.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#46 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): App\\Http\\Middleware\\TenantStartSession->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#47 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#48 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#49 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(66): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#50 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#51 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(105): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#52 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Routing/Router.php(683): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#53 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Routing/Router.php(658): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request))
#54 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Routing/Router.php(624): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route))
#55 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Routing/Router.php(613): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request))
#56 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(170): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request))
#57 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(130): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request))
#58 /private/var/www/project/vendor/fideloper/proxy/src/TrustProxies.php(57): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#59 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Fideloper\\Proxy\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#60 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#61 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#62 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#63 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#64 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#65 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#66 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(63): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#67 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Illuminate\\Foundation\\Http\\Middleware\\CheckForMaintenanceMode->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#68 /private/var/www/project/vendor/hyn/multi-tenant/src/Middleware/EagerIdentification.php(29): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#69 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Hyn\\Tenancy\\Middleware\\EagerIdentification->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#70 /private/var/www/project/vendor/hyn/multi-tenant/src/Middleware/HostnameActions.php(75): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#71 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Hyn\\Tenancy\\Middleware\\HostnameActions->handle(Object(Illuminate\\Http\\Request), Object(Closure))
#72 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(105): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request))
#73 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(145): Illuminate\\Pipeline\\Pipeline->then(Object(Closure))
#74 /private/var/www/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(110): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request))
#75 /private/var/www/project/public/index.php(55): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request))
#76 {main}
"}
Environment
- PHP: 7.2.24
- OS: Mac 10.14.6
- Laravel: 6.18.3
- Model Caching: 0.7.4
Additional context
The error is triggered by the function below.
protected function getValuesFromWhere(array $where) : string
{
if (array_key_exists("value", $where)
&& is_object($where["value"])
&& get_class($where["value"]) === "DateTime"
) {
return $where["value"]->format("Y-m-d-H-i-s");
}
if (is_array((new Arr)->get($where, "values"))) {
return implode("_", collect($where["values"])->flatten()->toArray());
}
return (new Arr)->get($where, "value", "");
}
I print the variable $where
out and it looks like this.
array:5 [▼
"type" => "JsonContains"
"column" => "location"
"value" => array:1 [▼
"stores" => array:1 [▼
"id" => 1
]
]
"boolean" => "or"
"not" => false
]
The $where
variable will not be processed and will be sent back directly to the caller and trigger type error. I add in another if inside the function and it seems to be working but not sure if it is the correct way to fix this issue.
protected function getValuesFromWhere(array $where) : string
{
if (array_key_exists("value", $where)
&& is_object($where["value"])
&& get_class($where["value"]) === "DateTime"
) {
return $where["value"]->format("Y-m-d-H-i-s");
}
if (is_array((new Arr)->get($where, "value"))) {
return implode("_", collect($where["value"])->flatten()->toArray());
}
if (is_array((new Arr)->get($where, "values"))) {
return implode("_", collect($where["values"])->flatten()->toArray());
}
return (new Arr)->get($where, "value", "");
}