From a70e09bddccdbe714c6ff751013c938f997b5af5 Mon Sep 17 00:00:00 2001 From: Leonid Nikitin Date: Sat, 25 Jul 2026 01:17:55 +0500 Subject: [PATCH] Add recursive method to fetch category path in DocumentationCategoryRepository - Implement `getPathFromRoot` to retrieve the category path using recursive SQL query. - Cache results for improved performance. --- .../DocumentationCategoryRepository.php | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/app/application/app/Repositories/DocumentationCategoryRepository.php b/app/application/app/Repositories/DocumentationCategoryRepository.php index 1f013aa..1c70a1c 100644 --- a/app/application/app/Repositories/DocumentationCategoryRepository.php +++ b/app/application/app/Repositories/DocumentationCategoryRepository.php @@ -11,6 +11,9 @@ use App\Services\Search\CreateSearchInstanceCommand; use App\Dto\Builder\DocumentationCategory as DocumentationCategoryBuilderDto; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Relations\HasOne; +use Illuminate\Support\Collection; +use Illuminate\Support\Facades\Cache; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Str; final readonly class DocumentationCategoryRepository @@ -93,4 +96,52 @@ final readonly class DocumentationCategoryRepository ->pluck('title', 'id') ->toArray(); } + + public function getPathFromRoot(int $categoryId, ?ProjectLanguage $projectLanguage): Collection + { + $seconds = 3600; + return Cache::remember(self::class . $categoryId . '_' . $projectLanguage->id ?? 0, $seconds, function () use ($categoryId, $projectLanguage) { + $rows = DB::select( + <<pluck('id')->all(); + + $with = [ + 'content' => function (HasOne $hasOne) use ($projectLanguage) { + /** @var ?ProjectLanguage $projectLanguage */ + $hasOne->when($projectLanguage, function (Builder $query, ProjectLanguage $projectLanguage) { + $query->where('language_id', $projectLanguage->id); + }); + } + ]; + + $categories = DocumentationCategory::query() + ->whereIn('id', $idsInOrder) + ->with($with) + ->get() + ->keyBy('id'); + + return collect($idsInOrder) + ->map(fn (int $id) => $categories->get($id)) + ->filter() + ->values(); + }); + } }