kirkbushell / eloquence

A drop-in library for certain database functionality in Laravel, that allows for extra features that may never make it into the main project.
MIT License
537 stars 60 forks source link

`firstOrNew` appears to be broken when using CamelCasing. #101

Closed mikebronner closed 5 months ago

mikebronner commented 2 years ago
(new AutomationStep)->firstOrNew($attributes);

fails when using softDeletes:

[previous exception] [object] (PDOException(code: 42703): SQLSTATE[42703]: Undefined column: 7 ERROR:  column \"deletedAt\" does not exist
LINE 1: ...ct * from \"automation_steps\" where (\"id\" = $1 and \"deletedAt...
                                                             ^
HINT:  Perhaps you meant to reference the column \"automation_steps.deleted_at\". at /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Database/Connection.php:401)
[stacktrace]
#0 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Database/Connection.php(401): PDOStatement->execute()
#1 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Database/Connection.php(735): Illuminate\\Database\\Connection->Illuminate\\Database\\{closure}()
#2 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Database/Connection.php(702): Illuminate\\Database\\Connection->runQueryCallback()
#3 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Database/Connection.php(404): Illuminate\\Database\\Connection->run()
#4 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2630): Illuminate\\Database\\Connection->select()
#5 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2618): Illuminate\\Database\\Query\\Builder->runSelect()
#6 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3154): Illuminate\\Database\\Query\\Builder->Illuminate\\Database\\Query\\{closure}()
#7 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(2619): Illuminate\\Database\\Query\\Builder->onceWithColumns()
#8 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(698): Illuminate\\Database\\Query\\Builder->get()
#9 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(682): Illuminate\\Database\\Eloquent\\Builder->getModels()
#10 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Database/Concerns/BuildsQueries.php(296): Illuminate\\Database\\Eloquent\\Builder->get()
#11 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(533): Illuminate\\Database\\Eloquent\\Builder->first()
#12 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Support/Traits/ForwardsCalls.php(23): Illuminate\\Database\\Eloquent\\Builder->firstOrNew()
#13 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(2163): Illuminate\\Database\\Eloquent\\Model->forwardCallTo()
#14 /home/forge/mike-b.totalitylms.com/app/Http/Livewire/Automation.php(81): Illuminate\\Database\\Eloquent\\Model->__call()
#15 [internal function]: App\\Http\\Livewire\\Automation->App\\Http\\Livewire\\{closure}()
#16 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Collections/Arr.php(558): array_map()
#17 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Collections/Collection.php(723): Illuminate\\Support\\Arr::map()
#18 /home/forge/mike-b.totalitylms.com/app/Http/Livewire/Automation.php(87): Illuminate\\Support\\Collection->map()
#19 /home/forge/mike-b.totalitylms.com/vendor/livewire/livewire/src/HydrationMiddleware/CallPropertyHydrationHooks.php(20): App\\Http\\Livewire\\Automation->hydrateSteps()
#20 /home/forge/mike-b.totalitylms.com/vendor/livewire/livewire/src/LifecycleManager.php(89): Livewire\\HydrationMiddleware\\CallPropertyHydrationHooks::hydrate()
#21 /home/forge/mike-b.totalitylms.com/vendor/livewire/livewire/src/Connection/ConnectionHandler.php(13): Livewire\\LifecycleManager->hydrate()
#22 /home/forge/mike-b.totalitylms.com/vendor/livewire/livewire/src/Controllers/HttpConnectionHandler.php(20): Livewire\\Connection\\ConnectionHandler->handle()
#23 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(48): Livewire\\Controllers\\HttpConnectionHandler->__invoke()
#24 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Routing/Route.php(261): Illuminate\\Routing\\ControllerDispatcher->dispatch()
#25 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Routing/Route.php(204): Illuminate\\Routing\\Route->runController()
#26 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Routing/Router.php(725): Illuminate\\Routing\\Route->run()
#27 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(141): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}()
#28 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#29 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle()
#30 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(78): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#31 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle()
#32 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#33 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle()
#34 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(121): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#35 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(64): Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest()
#36 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Session\\Middleware\\StartSession->handle()
#37 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#38 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle()
#39 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(67): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#40 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle()
#41 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(116): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#42 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Routing/Router.php(726): Illuminate\\Pipeline\\Pipeline->then()
#43 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Routing/Router.php(703): Illuminate\\Routing\\Router->runRouteWithinStack()
#44 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Routing/Router.php(667): Illuminate\\Routing\\Router->runRoute()
#45 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Routing/Router.php(656): Illuminate\\Routing\\Router->dispatchToRoute()
#46 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(167): Illuminate\\Routing\\Router->dispatch()
#47 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(141): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}()
#48 /home/forge/mike-b.totalitylms.com/vendor/livewire/livewire/src/DisableBrowserCache.php(19): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#49 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Livewire\\DisableBrowserCache->handle()
#50 /home/forge/mike-b.totalitylms.com/vendor/genealabs/laravel-governor/src/Http/Middleware/ParseCustomPolicyActions.php(23): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#51 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): GeneaLabs\\LaravelGovernor\\Http\\Middleware\\ParseCustomPolicyActions->handle()
#52 /home/forge/mike-b.totalitylms.com/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(60): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#53 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle()
#54 /home/forge/mike-b.totalitylms.com/vendor/genealabs/laravel-casts/src/Http/Middleware/AssetInjection.php(10): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#55 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): GeneaLabs\\LaravelCasts\\Http\\Middleware\\AssetInjection->handle()
#56 /home/forge/mike-b.totalitylms.com/vendor/mikefrancis/laravel-secureheaders/src/ApplySecureHeaders.php(48): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#57 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): MikeFrancis\\LaravelSecureHeaders\\ApplySecureHeaders->handle()
#58 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#59 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()
#60 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(36): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#61 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()
#62 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#63 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle()
#64 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(86): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#65 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()
#66 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#67 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Http\\Middleware\\HandleCors->handle()
#68 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#69 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Http\\Middleware\\TrustProxies->handle()
#70 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(116): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#71 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(142): Illuminate\\Pipeline\\Pipeline->then()
#72 /home/forge/mike-b.totalitylms.com/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(111): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()
#73 /home/forge/mike-b.totalitylms.com/public/index.php(52): Illuminate\\Foundation\\Http\\Kernel->handle()
kirkbushell commented 2 years ago

Looks like with this particular issue Eloquent defers to the Builder, so in order to manage this we'd need to set it up on the model, change the attributes and then defer.

I'm currently just adding Laravel 9 support, but if you wanted to setup a PR, I can check today and merge.

mikebronner commented 2 years ago

Looks like with this particular issue Eloquent defers to the Builder, so in order to manage this we'd need to set it up on the model, change the attributes and then defer.

I'm currently just adding Laravel 9 support, but if you wanted to setup a PR, I can check today and merge.

Thanks Kirk, I'm a bit stumped by this ... I implemented a work-around to avoid firstOrNew for the time bring.

kirkbushell commented 10 months ago

Looks like with this particular issue Eloquent defers to the Builder, so in order to manage this we'd need to set it up on the model, change the attributes and then defer. I'm currently just adding Laravel 9 support, but if you wanted to setup a PR, I can check today and merge.

Thanks Kirk, I'm a bit stumped by this ... I implemented a work-around to avoid firstOrNew for the time bring.

I'm currently working on version 11 which is a complete rebuild of the entire system. I'll add a test for firstOrNew and see what's going on.

kirkbushell commented 5 months ago

@mikebronner Try now on v11.