Контроллер, чтобы иметь возможность искать имя и фамилию - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь сделать этот контроллер более динамичным, позволяя ему выполнять поиск по имени и фамилии.В данный момент контроллер выполняет поиск только по имени, фамилии и адресу электронной почты.Я хотел бы иметь возможность ввести в фильтр "$ 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());
    }
}

1 Ответ

0 голосов
/ 12 июня 2019

orX() позволяет вам делать условные заявления с Doctrine.

например, если вы хотите получить синий или красный автомобили:

$qb = $this->createQueryBuilder('cars');

$firstCondition = $qb->expr()->eq('cars.color', 'blue');
$secondCondition = $qb->expr()->eq('cars.color', 'red'); 

$qb->where($qb->expr()->orX($firstCondition, $secondCondition));
$qb->setParameter('blue', 'blue');
$qb->setParameter('red', 'red');

$result = $qb->getQuery()->getResult();

Вы можете получить тот же результат, выполнив:

$qb = $this->createQueryBuilder('cars');

$qb
    ->where('cars.color = :blue')
    ->orWhere('cars.color = :red')
    ->setParamters([
        'blue' => 'blue',
        'red' => 'red',
    ])
;

$result = $qb->getQuery()->getResult();
...