feat: enhance search functionality to include parent names and related fields across categories
This commit is contained in:
@@ -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
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user