feat: enhance search functionality to include parent names and related fields across categories

This commit is contained in:
hamed
2026-08-08 14:57:36 +03:30
parent 35181cd715
commit d74a351e5a
11 changed files with 250 additions and 21 deletions
@@ -104,15 +104,19 @@ class DoctorServiceController extends BaseController
$search = trim((string) $request->query->get('search', ''));
$specialtyId = $request->query->get('specialty_id');
$qb = $this->repo->createQueryBuilder('ds');
$qb = $this->repo->createQueryBuilder('ds')
->leftJoin('ds.specialty', 'sp')
->addSelect('sp');
if ($request->query->get('sort') === 'id') {
$qb->orderBy('ds.id', strtoupper((string) $request->query->get('order')) === 'DESC' ? 'DESC' : 'ASC');
} else {
$qb->orderBy('ds.weight', 'ASC')->addOrderBy('ds.name', 'ASC');
}
// نام تخصصِ والد هم جستجو می‌شود: خدمات را معمولاً ذیل تخصص می‌جویند.
if ($search !== '') {
$qb->andWhere('ds.name LIKE :s')->setParameter('s', '%' . $search . '%');
$qb->andWhere('ds.name LIKE :s OR ds.slug LIKE :s OR sp.name LIKE :s')
->setParameter('s', '%' . $search . '%');
}
if ($specialtyId !== null && $specialtyId !== '') {
$qb->andWhere('ds.specialty = :sp')->setParameter('sp', (int) $specialtyId);
@@ -121,8 +125,13 @@ class DoctorServiceController extends BaseController
$total = (clone $qb)->select('COUNT(ds.id)')->getQuery()->getSingleScalarResult();
$rows = $qb->setFirstResult(($page - 1) * $limit)->setMaxResults($limit)->getQuery()->getResult();
// specialty_name فقط در لیست ادمین می‌آید — تخصص اینجا با join هیدریت شده و
// جستجو ممکن است خدمتی را برگرداند که تخصصش در صفحهٔ جاری نیست.
return $this->paginated(
array_map(fn(DoctorService $ds) => $ds->toArray(), $rows),
array_map(
static fn(DoctorService $ds) => $ds->toArray() + ['specialty_name' => $ds->getSpecialty()?->getName()],
$rows
),
(int) $total, $page, $limit
);
}
@@ -200,8 +200,10 @@ class LocationController extends BaseController
$qb->orderBy('c.weight', 'ASC')->addOrderBy('c.name', 'ASC');
}
// نام استانِ والد هم جستجو می‌شود، به‌علاوهٔ نام سایت و دامنه که شناسهٔ عملی شهرند.
if ($search !== '') {
$qb->andWhere('c.name LIKE :s')->setParameter('s', '%' . $search . '%');
$qb->andWhere('c.name LIKE :s OR c.siteName LIKE :s OR c.domain LIKE :s OR p.name LIKE :s')
->setParameter('s', '%' . $search . '%');
}
if ($provinceId !== null && $provinceId !== '') {
$qb->andWhere('c.province = :province')->setParameter('province', (int) $provinceId);
@@ -138,15 +138,22 @@ class SpecialtyController extends BaseController
$qb->orderBy('s.weight', 'ASC')->addOrderBy('s.name', 'ASC');
}
// نام والد هم جستجو می‌شود: زیرتخصص‌ها را معمولاً با نام تخصص مادر می‌جویند.
if ($search !== '') {
$qb->andWhere('s.name LIKE :s')->setParameter('s', '%' . $search . '%');
$qb->andWhere('s.name LIKE :s OR s.slug LIKE :s OR p.name LIKE :s')
->setParameter('s', '%' . $search . '%');
}
$total = (clone $qb)->select('COUNT(s.id)')->getQuery()->getSingleScalarResult();
$rows = $qb->setFirstResult(($page - 1) * $limit)->setMaxResults($limit)->getQuery()->getResult();
// parent_name فقط در لیست ادمین می‌آید — والد اینجا با join هیدریت شده و
// جستجو ممکن است فرزندی را برگرداند که والدش در صفحهٔ جاری نیست.
return $this->paginated(
array_map(fn(Specialty $s) => $s->toArray(), $rows),
array_map(
static fn(Specialty $s) => $s->toArray() + ['parent_name' => $s->getParent()?->getName()],
$rows
),
(int) $total, $page, $limit
);
}
+1 -1
View File
@@ -93,7 +93,7 @@ class TagController extends BaseController
$qb->orderBy('t.name', 'ASC');
}
if ($search !== '') {
$qb->andWhere('t.name LIKE :s')->setParameter('s', '%' . $search . '%');
$qb->andWhere('t.name LIKE :s OR t.slug LIKE :s')->setParameter('s', '%' . $search . '%');
}
$total = (clone $qb)->select('COUNT(t.id)')->getQuery()->getSingleScalarResult();