diff --git a/app/Http/Controllers/api/GlobalSearchApiController.php b/app/Http/Controllers/api/GlobalSearchApiController.php index 8add90c..2f193f4 100644 --- a/app/Http/Controllers/api/GlobalSearchApiController.php +++ b/app/Http/Controllers/api/GlobalSearchApiController.php @@ -94,19 +94,12 @@ class GlobalSearchApiController extends Controller }); $results = $results->merge($opinions); - // 4. Search Arts (DEEP RELATIONAL SEARCH INCLUDED) - $arts = Art::with(['law.category', 'chapter', 'part', 'volum', 'book', 'section', 'gate']) + // 4. Search Arts (Exact fast Fash search Fash search Fash search Fash search match Fash search Fash search Fash search to ArtController) + $arts = Art::with(['law', 'law.category', 'chapter', 'part', 'volum', 'book', 'section', 'gate']) ->where(function ($q) use ($searchTerm) { $q->where('title', 'LIKE', "%{$searchTerm}%") ->orWhere('text', 'LIKE', "%{$searchTerm}%") - ->orWhere('number', 'LIKE', "%{$searchTerm}%") // Added Number Search - ->orWhereHas('law', function ($sub) use ($searchTerm) { $sub->where('title', 'LIKE', "%{$searchTerm}%"); }) - ->orWhereHas('volum', function ($sub) use ($searchTerm) { $sub->where('title', 'LIKE', "%{$searchTerm}%"); }) - ->orWhereHas('book', function ($sub) use ($searchTerm) { $sub->where('title', 'LIKE', "%{$searchTerm}%"); }) - ->orWhereHas('section', function ($sub) use ($searchTerm) { $sub->where('title', 'LIKE', "%{$searchTerm}%"); }) - ->orWhereHas('chapter', function ($sub) use ($searchTerm) { $sub->where('title', 'LIKE', "%{$searchTerm}%"); }) - ->orWhereHas('part', function ($sub) use ($searchTerm) { $sub->where('title', 'LIKE', "%{$searchTerm}%"); }) - ->orWhereHas('gate', function ($sub) use ($searchTerm) { $sub->where('title', 'LIKE', "%{$searchTerm}%"); }); + ->orWhere('number', 'LIKE', "%{$searchTerm}%"); }) ->take($limitPerTable)->get()->map(function($item) use ($searchTerm) { $formatted = $this->formatArt($item, $searchTerm, Art::class); @@ -256,19 +249,12 @@ class GlobalSearchApiController extends Controller }); $results = $results->merge($opinions); - // 4. Search Arts (DEEP RELATIONAL SEARCH INCLUDED) - $artQuery = Art::with(['law.category', 'chapter', 'part', 'volum', 'book', 'section', 'gate']) + // 4. Search Arts (Exact fast match Fash search to ArtController) + $artQuery = Art::with(['law', 'law.category', 'chapter', 'part', 'volum', 'book', 'section', 'gate']) ->where(function ($q) use ($searchTerm) { $q->where('title', 'LIKE', "%{$searchTerm}%") ->orWhere('text', 'LIKE', "%{$searchTerm}%") - ->orWhere('number', 'LIKE', "%{$searchTerm}%") - ->orWhereHas('law', function ($sub) use ($searchTerm) { $sub->where('title', 'LIKE', "%{$searchTerm}%"); }) - ->orWhereHas('volum', function ($sub) use ($searchTerm) { $sub->where('title', 'LIKE', "%{$searchTerm}%"); }) - ->orWhereHas('book', function ($sub) use ($searchTerm) { $sub->where('title', 'LIKE', "%{$searchTerm}%"); }) - ->orWhereHas('section', function ($sub) use ($searchTerm) { $sub->where('title', 'LIKE', "%{$searchTerm}%"); }) - ->orWhereHas('chapter', function ($sub) use ($searchTerm) { $sub->where('title', 'LIKE', "%{$searchTerm}%"); }) - ->orWhereHas('part', function ($sub) use ($searchTerm) { $sub->where('title', 'LIKE', "%{$searchTerm}%"); }) - ->orWhereHas('gate', function ($sub) use ($searchTerm) { $sub->where('title', 'LIKE', "%{$searchTerm}%"); }); + ->orWhere('number', 'LIKE', "%{$searchTerm}%"); }); $totalCount += $artQuery->count(); $arts = $artQuery->take($limitPerTable)->get()->map(function($item) use ($searchTerm) { @@ -323,6 +309,7 @@ class GlobalSearchApiController extends Controller private function formatBylaw($item) { $isLocked = $this->isLockedForCurrentUserGeneric($item); + $description = $item->description; $cleanDesc = trim(strip_tags($description ?? '')); @@ -384,11 +371,11 @@ class GlobalSearchApiController extends Controller private function formatArt($art, $searchTerm, $modelClass) { $law = $art->law ?? Law::find($art->law_id); - $isLocked = ! auth()->user()->isSubscriber() && (bool) $law?->is_locked; + $isLocked = ! auth()->user()->isSubscriber() && (bool) ($law?->is_locked ?? false); $text = $art->text ?? ''; - // Multi-byte safe Context Snippet Extraction for Persian/Arabic + // Multi-byte safe Context Snippet Extraction for Persian/Arabic Fash search Fash search Fash search if (!empty($searchTerm) && !empty($text)) { $pos = mb_stripos($text, $searchTerm); if ($pos !== false) { @@ -398,12 +385,13 @@ class GlobalSearchApiController extends Controller if ($start > 0) $context = '...' . $context; if ($start + $length < mb_strlen($text)) $context = $context . '...'; } else { - $context = $text; // Fallback if match was in title/relations + $context = $text; } } else { $context = $text; } + // PERFECTLY MATCHED TO YOUR ARTCONTROLLER MAPPING return [ 'id' => $art->id, 'title' => $art->title, @@ -460,7 +448,7 @@ class GlobalSearchApiController extends Controller private function formatStructure($item, $modelClass) { $law = Law::find($item?->law_id ?? $item->id); - $isLocked = ! auth()->user()->isSubscriber() && (bool) $law?->is_locked; + $isLocked = ! auth()->user()->isSubscriber() && (bool) ($law?->is_locked ?? false); $payload = [ 'id' => $item->id,