dive-be / laravel-wishlist

Manage your users' wishes in your Laravel app
MIT License
5 stars 2 forks source link

Wishlist::all() triggers Wish::make() error #5

Closed liepumartins closed 1 year ago

liepumartins commented 1 year ago

Stumbled across strange error.

TypeError:
Dive\Wishlist\Wish::make(): Argument #2 ($wishable) must be of type Dive\Wishlist\Contracts\Wishable, null given, called in /home/vagrant/mysite/vendor/dive-be/laravel-wishlist/src/Wish.php on line 26

  at /home/vagrant/mysite/vendor/dive-be/laravel-wishlist/src/Wish.php:29
  at Dive\Wishlist\Wish::make()
     (/home/vagrant/mysite/vendor/dive-be/laravel-wishlist/src/Wish.php:26)
  at Dive\Wishlist\Wish::of()
  at array_map()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Collections/Arr.php:560)
  at Illuminate\Support\Arr::map()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Collections/Collection.php:739)
  at Illuminate\Support\Collection->map()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Collection.php:359)
  at Illuminate\Database\Eloquent\Collection->map()
     (/home/vagrant/mysite/vendor/dive-be/laravel-wishlist/src/EloquentWishlist.php:47)
  at Dive\Wishlist\EloquentWishlist->Dive\Wishlist\{closure}()
     (/home/vagrant/mysite/vendor/dive-be/laravel-wishlist/src/Support/PoorMansCaching.php:35)
  at Dive\Wishlist\EloquentWishlist->remember()
     (/home/vagrant/mysite/vendor/dive-be/laravel-wishlist/src/EloquentWishlist.php:48)
  at Dive\Wishlist\EloquentWishlist->all()
     (/home/vagrant/mysite/vendor/dive-be/laravel-wishlist/src/WishlistEventDecorator.php:29)
  at Dive\Wishlist\WishlistEventDecorator->all()
     (/home/vagrant/mysite/vendor/dive-be/laravel-wishlist/src/WishlistManager.php:89)
  at Dive\Wishlist\WishlistManager->all()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:338)
  at Illuminate\Support\Facades\Facade::__callStatic()
     (/home/vagrant/mysite/app/Models/Product.php:161)
  at App\Models\Product::scopeWishlist()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php:1613)
  at Illuminate\Database\Eloquent\Model->callNamedScope()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:1331)
  at Illuminate\Database\Eloquent\Builder->Illuminate\Database\Eloquent\{closure}()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:1312)
  at Illuminate\Database\Eloquent\Builder->callScope()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:1330)
  at Illuminate\Database\Eloquent\Builder->callNamedScope()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:1865)
  at Illuminate\Database\Eloquent\Builder->__call()
     (/home/vagrant/mysite/app/Http/Livewire/ShowNomenclatures.php:94)
  at App\Http\Livewire\ShowNomenclatures->nomenclatures()
     (/home/vagrant/mysite/app/Http/Livewire/ShowNomenclatures.php:69)
  at App\Http\Livewire\ShowNomenclatures->render()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:36)
  at Illuminate\Container\BoundMethod::Illuminate\Container\{closure}()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Container/Util.php:41)
  at Illuminate\Container\Util::unwrapIfClosure()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:93)
  at Illuminate\Container\BoundMethod::callBoundMethod()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:37)
  at Illuminate\Container\BoundMethod::call()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Container/Container.php:651)
  at Illuminate\Container\Container->call()
     (/home/vagrant/mysite/vendor/livewire/livewire/src/Component.php:173)
  at Livewire\Component->renderToView()
     (/home/vagrant/mysite/vendor/livewire/livewire/src/LifecycleManager.php:131)
  at Livewire\LifecycleManager->renderToView()
     (/home/vagrant/mysite/vendor/livewire/livewire/src/LivewireManager.php:108)
  at Livewire\LivewireManager->mount()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:338)
  at Illuminate\Support\Facades\Facade::__callStatic()
     (/home/vagrant/mysite/storage/framework/views/e6198dc47ad764de4a5a7549e1264d133cd540cf.php:63)
  at require('/home/vagrant/mysite/storage/framework/views/e6198dc47ad764de4a5a7549e1264d133cd540cf.php')
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:109)
  at Illuminate\Filesystem\Filesystem::Illuminate\Filesystem\{closure}()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Filesystem/Filesystem.php:110)
  at Illuminate\Filesystem\Filesystem->getRequire()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/View/Engines/PhpEngine.php:58)
  at Illuminate\View\Engines\PhpEngine->evaluatePath()
     (/home/vagrant/mysite/vendor/livewire/livewire/src/ComponentConcerns/RendersLivewireComponents.php:69)
  at Livewire\LivewireViewCompilerEngine->evaluatePath()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/View/Engines/CompilerEngine.php:70)
  at Illuminate\View\Engines\CompilerEngine->get()
     (/home/vagrant/mysite/vendor/livewire/livewire/src/ComponentConcerns/RendersLivewireComponents.php:35)
  at Livewire\LivewireViewCompilerEngine->get()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/View/View.php:152)
  at Illuminate\View\View->getContents()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/View/View.php:135)
  at Illuminate\View\View->renderContents()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/View/View.php:104)
  at Illuminate\View\View->render()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Http/Response.php:69)
  at Illuminate\Http\Response->setContent()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Http/Response.php:35)
  at Illuminate\Http\Response->__construct()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Routing/Router.php:906)
  at Illuminate\Routing\Router::toResponse()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Routing/Router.php:875)
  at Illuminate\Routing\Router->prepareResponse()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Routing/Router.php:798)
  at Illuminate\Routing\Router->Illuminate\Routing\{closure}()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:141)
  at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
     (/home/vagrant/mysite/app/Http/Controllers/FrontController.php:25)
  at App\Http\Controllers\FrontController->App\Http\Controllers\{closure}()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:162)
  at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
     (/home/vagrant/mysite/app/Http/Middleware/UpgradedAndVerified.php:43)
  at App\Http\Middleware\UpgradedAndVerified->handle()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180)
  at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
     (/home/vagrant/mysite/vendor/spatie/laravel-csp/src/AddCspHeaders.php:13)
  at Spatie\Csp\AddCspHeaders->handle()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180)
  at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php:50)
  at Illuminate\Routing\Middleware\SubstituteBindings->handle()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180)
  at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php:78)
  at Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180)
  at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php:49)
  at Illuminate\View\Middleware\ShareErrorsFromSession->handle()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180)
  at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php:121)
  at Illuminate\Session\Middleware\StartSession->handleStatefulRequest()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php:96)
  at Illuminate\Session\Middleware\StartSession->handleRequestWhileBlocking()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php:61)
  at Illuminate\Session\Middleware\StartSession->handle()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180)
  at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php:37)
  at Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180)
  at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php:67)
  at Illuminate\Cookie\Middleware\EncryptCookies->handle()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180)
  at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:116)
  at Illuminate\Pipeline\Pipeline->then()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Routing/Router.php:799)
  at Illuminate\Routing\Router->runRouteWithinStack()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Routing/Router.php:776)
  at Illuminate\Routing\Router->runRoute()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Routing/Router.php:740)
  at Illuminate\Routing\Router->dispatchToRoute()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Routing/Router.php:729)
  at Illuminate\Routing\Router->dispatch()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:190)
  at Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:141)
  at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
     (/home/vagrant/mysite/vendor/livewire/livewire/src/DisableBrowserCache.php:19)
  at Livewire\DisableBrowserCache->handle()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180)
  at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
     (/home/vagrant/mysite/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php:66)
  at Barryvdh\Debugbar\Middleware\InjectDebugbar->handle()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180)
  at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
     (/home/vagrant/mysite/vendor/laravel/vapor-core/src/Http/Middleware/ServeStaticAssets.php:21)
  at Laravel\Vapor\Http\Middleware\ServeStaticAssets->handle()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180)
  at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php:39)
  at Illuminate\Http\Middleware\TrustProxies->handle()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180)
  at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:21)
  at Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php:31)
  at Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180)
  at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:21)
  at Illuminate\Foundation\Http\Middleware\TransformsRequest->handle()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php:40)
  at Illuminate\Foundation\Http\Middleware\TrimStrings->handle()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180)
  at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php:27)
  at Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180)
  at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php:86)
  at Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:180)
  at Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:116)
  at Illuminate\Pipeline\Pipeline->then()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:165)
  at Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter()
     (/home/vagrant/mysite/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:134)
  at Illuminate\Foundation\Http\Kernel->handle()
     (/home/vagrant/mysite/public/index.php:58) 
public static function scopeWishlist(Builder $builder): void
    {
        $ids = [];
        foreach (Wishlist::all() as $wish) { // this Wishlist::all() causes the error
            $ids[] = $wish->wishable->pk_product;
        }
        $builder->whereIn('products.pk_product, $ids);
    }
WISHLIST_DRIVER=upgrade
laravel 9.46
wishlist 1.2.1
liepumartins commented 1 year ago

Appears to be a bug. Wishlist::count() returns value - 27 Wishes table contains 27 records.

However one of the Wishables Product is "out-of-scope" because of a globalScope on the Product, thus only 26 records are actually valid.

I need both cookie and database records, thus doing something simpler like this, is not enough.

    public static function scopeDbWishlist(Builder $builder): void
    {
        $builder->join('wishes', 'wishes.wishable_id', '=', 'products.pk_product')
            ->where('wishes.wishable_type', '=', 'App\Models\Product')
        ->where('wishes.user_id', '=', auth()->id());
    }

Is there maybe a smarter, more efficient way to retrieve all wishable_id's (for user)? Wishlist::all() feels like an overkill anyway.

mabdullahsari commented 1 year ago

The wishable relationship will now ignore any active global scopes.

Please upgrade to 1.2.2.