PHP Doctrine Запрос И ИЛИ ИЛИ - PullRequest
       55

PHP Doctrine Запрос И ИЛИ ИЛИ

0 голосов
/ 13 февраля 2020

В базе данных есть Продукты с множеством опций, два из них, скажем, Вариант 1 и Вариант 2. Мне нужно сделать запрос (я знаю, как построить все это, я просто застрял со следующей логикой * Только 1029 *), который будет показывать только такие продукты, где:

  1. Если не выбран ни 1, ни 2 вариант, показать все продукты
  2. Если выбран 1 вариант, показывать только те продукты, которые имеют опция
  3. Если выбраны опции 2, показывать только те продукты с этой опцией
  4. Если выбраны опции 1 и опция 2, показывать только те товары с этими двумя опциями

Я попробовал это:

function GetProducts(keywords) {
...
    ->andWhere($qb->expr()->orX(
        $qb->expr()->eq('option1', keywords['option1']),
        $qb->expr()->eq('option2', keywords['option2'])
    ))
...
}

Ключевыми словами ['option1'] и ключевыми словами ['option2'] являются значения 0 или 1 из флажков с такими параметрами.

Но результатом является следующее:

  1. Если не выбран ни вариант 1, ни вариант 2, отображаются все продукты - ОК
  2. Если выбран вариант 1, продукты с вариантом 1 И все продукты без какого-либо из этих двух параметров показаны - НЕ то, что мне нужно * 10 23 *
  3. Если выбран вариант 2, отображаются продукты с вариантом 1 и все те, у кого нет этих двух вариантов - НЕ то, что мне нужно
  4. Если выбран вариант 1 и вариант 2, отображаются все продукты - НЕ что мне нужно

1 Ответ

0 голосов
/ 19 февраля 2020
public function getRandomSearch($keywords)
{
    $em = DatabaseORM::entityManager();
    $qb = $em->createQueryBuilder();
    $qb->select('c')
        ->from('Products\Product', 'c');

    if ($keywords['option1'] && !$keywords['option2']) {
        $qb->andWhere($qb->expr()->eq('c.option1', $keywords['option1']));
    }
    elseif (!$keywords['option1'] && $keywords['option2']) {
        $qb->andWhere($qb->expr()->eq('c.option2', $keywords['option2']));
    }
    elseif ($keywords['option1'] && $keywords['option2']) {
        $qb->andWhere($qb->expr()->orX(
            $qb->expr()->eq('c.option1', $keywords['option1']),
            $qb->expr()->eq('c.option2', $keywords['option2'])
        ));
    }

    return $qb->getQuery()
        ->getResult();
}
...