From 6f49b93ba9d97cb82e19e8d5573fbb22c16d7c74 Mon Sep 17 00:00:00 2001 From: indy koning Date: Mon, 12 Jan 2026 13:43:20 +0100 Subject: [PATCH 1/2] Only load used attributes on product detail --- src/Http/Controllers/ProductController.php | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/Http/Controllers/ProductController.php b/src/Http/Controllers/ProductController.php index 2c8a1bef5..8106eef39 100644 --- a/src/Http/Controllers/ProductController.php +++ b/src/Http/Controllers/ProductController.php @@ -2,8 +2,12 @@ namespace Rapidez\Core\Http\Controllers; +use Illuminate\Database\Eloquent\Builder; +use Illuminate\Database\Eloquent\Relations\Relation; use Illuminate\Support\Arr; +use Illuminate\Support\Facades\App; use Rapidez\Core\Events\ProductViewEvent; +use Rapidez\Core\Models\EavAttribute; use Rapidez\Core\Models\Product; use TorMorten\Eventy\Facades\Eventy; @@ -12,14 +16,25 @@ class ProductController public function show(int $productId) { $productModel = config('rapidez.models.product'); + $productModel::shouldBeStrict(!App::isProduction()); // Throw errors if relations are used but not eager loaded if not in production. + $frontAttributes = EavAttribute::getCachedCatalog()->where('is_visible_on_front', 1)->pluck('attribute_id'); /** @var \Rapidez\Core\Models\Product $product */ $product = $productModel::query() - ->withEventyGlobalScopes('productpage.scopes') ->whereInAttribute('visibility', [ Product::VISIBILITY_IN_CATALOG, Product::VISIBILITY_BOTH, ]) + // It's important these are AFTER `whereInAttribute` + // as it seems to reset the global scopes + ->withoutGlobalscope('customAttributes') + ->withGlobalScope('customAttributes', fn (Builder $builder) => + $builder->withCustomAttributes( + fn (Relation $q) => $q + ->whereIn($q->qualifyColumn('attribute_id'), $frontAttributes) + ) + ) + ->withEventyGlobalScopes('productpage.scopes') ->findOrFail($productId); $attributes = [ From 415145be6f3e0575af761a7b3cbda3d552f0668f Mon Sep 17 00:00:00 2001 From: indykoning Date: Mon, 12 Jan 2026 12:43:55 +0000 Subject: [PATCH 2/2] Apply fixes from Duster --- src/Http/Controllers/ProductController.php | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/Http/Controllers/ProductController.php b/src/Http/Controllers/ProductController.php index 8106eef39..911f7a6ef 100644 --- a/src/Http/Controllers/ProductController.php +++ b/src/Http/Controllers/ProductController.php @@ -16,7 +16,7 @@ class ProductController public function show(int $productId) { $productModel = config('rapidez.models.product'); - $productModel::shouldBeStrict(!App::isProduction()); // Throw errors if relations are used but not eager loaded if not in production. + $productModel::shouldBeStrict(! App::isProduction()); // Throw errors if relations are used but not eager loaded if not in production. $frontAttributes = EavAttribute::getCachedCatalog()->where('is_visible_on_front', 1)->pluck('attribute_id'); /** @var \Rapidez\Core\Models\Product $product */ @@ -28,11 +28,10 @@ public function show(int $productId) // It's important these are AFTER `whereInAttribute` // as it seems to reset the global scopes ->withoutGlobalscope('customAttributes') - ->withGlobalScope('customAttributes', fn (Builder $builder) => - $builder->withCustomAttributes( - fn (Relation $q) => $q - ->whereIn($q->qualifyColumn('attribute_id'), $frontAttributes) - ) + ->withGlobalScope('customAttributes', fn (Builder $builder) => $builder->withCustomAttributes( + fn (Relation $q) => $q + ->whereIn($q->qualifyColumn('attribute_id'), $frontAttributes) + ) ) ->withEventyGlobalScopes('productpage.scopes') ->findOrFail($productId);