Я пытаюсь сделать этот контроллер более динамичным, позволяя ему выполнять поиск по имени и фамилии.В данный момент контроллер выполняет поиск только по имени, фамилии и адресу электронной почты.Я хотел бы иметь возможность ввести в фильтр "$ filter = Chris smith" и запросить результаты "Chris smith".
Ниже мой контроллер.
открытая функция getEventSessionAttendeeAction (запрос $ request, $ eventSessionId) {
$filterName = 'filter';
$searchFields = [
'o.email',
'a.email',
'a.firstName',
'a.lastName',
'a.barcode1',
'a.barcode2',
'a.id',
'o.id',
$lname = 'a.lastName',
$fname = 'a.firstName'
];
$filter = $request->get('filter');
$match_level = 0;
if ( filter_var($filter, FILTER_VALIDATE_EMAIL)) {
$searchFields = [
'a.email'
];
$match_level = 1;
}elseif(preg_match('/^[a-zA-Z\-]*$/', $filter)){
$searchFields = [
'a.lastName',
'a.firstName'
];
$match_level = 2;
}else{
$lname = 'a.lastName';
$fname = 'a.firstName';
}
try {
/** @var ApiEntity\EventSession $eventSession */
// $eventSession = $this->get('doctrine')->getRepository('KCMApiBundle:EventSession')->findOneById($eventSessionId);
// $eventAttendees = $this->getEventSessionAttendeesCheckedIn($eventSession);
$em = $this->getDoctrine()->getManager();
$qb = $em->createQueryBuilder();
$qb ->select('a.firstName, a.lastName, a.relationship, a.dateOfBirth, a.barcode1, a.phoneNumber, ea.address1, ea.address2, ea.city, ea.state, ea.country, ea.postal, s.name, s.keynoteSpeaker, ci.created, \'checkin\' AS event')
->from('KCMApiBundle:EventSessionCheckin', 'ci')
->innerJoin('ci.eventSession', 's')
->innerJoin('ci.eventAttendee', 'a')
->leftJoin('a.eventAttendeeAddresses', 'ea')
->where($qb->expr()->andX(
$qb->expr()->eq('ci.eventSession', $qb->expr()->literal($eventSessionId))
));
// ->where('ci.eventSession = :sessions')
// ->groupBy('a.id', 's.id')
// ->setParameter('sessions', $eventSessionId)
$expr = $qb->expr()->orX();
foreach ($searchFields as $field){
if ($match_level === 1){
$literalFilter = $filter;
$expr->add($qb->expr()->like($field, $qb->expr()->literal($literalFilter)));
}elseif ($match_level === 2){
$literalFilter = $filter;
$expr->add($qb->expr()->eq($field, $qb->expr()->literal($literalFilter)));
}else{
$literalFilter = $filter;
$expr->add($qb->expr()->concat($lname, $qb->expr()->concat($qb->expr()->literal($literalFilter), $fname)));
}
}
$qb->andWhere($expr);
$results = $qb->getQuery()->getResult();
if ($results) {
return $this->getApi()->serialize($results);
}
return new Response(null, Response::HTTP_NOT_FOUND);
} catch (\Exception $e) {
$this->get('logger')->error($e->getMessage());
}
}