Как определить несколько запросов orWhere с помощью Doctrines Query Builder - PullRequest
0 голосов
/ 04 декабря 2018

Я хочу создать запрос, используя Doctrines QueryBuilder.

Пользователь может выбирать поля базы данных, в которых нужно искать, устанавливая или снимая флажки в форме HTML.Вот почему $_POST contains 'filters' и «like».

$_POST['filters'] выглядит следующим образом:

array(2) { [0]=> string(4) "rack" [1]=> string(5) "shelf" } 

Я пытаюсь заставить следующий запрос работать так, чтобы

SELECT * FROM `inventories` WHERE (`rack` OR `shelf` LIKE '%01%') AND `checkedOutAt` IS NULL ORDER BY `lastChangedAt`

Я использую Doctrine в версии 2.5.5 и PHP в версии 7. Мой контроллер выглядит следующим образом:

public function searchAction()
{
    $filters = array();
    $em = $this->getEntityManager();
    $vendors = $em->getRepository('Entities\Vendor')->findAll();

    if ($_POST)
    {
        $filters = $_POST['filters'];
        $like = trim($_POST['like']);
        $inventories = $em
            ->getRepository('Entities\Inventory')
            ->findInventoriesBySearch($like, $filters)
        ;
        $this->addContext('like', $like);
    }
    else
    {
        $inventories = $em
            ->getRepository('Entities\Inventory')
            ->findInventories()
        ;
    }

    $count = count($inventories);

    $this->addContext('filters', $filters);
    $this->addContext('vendors', $vendors);
    $this->addContext('inventories', $inventories);
    $this->addContext('count', $count);
    $this->setTemplate('inventoryAction');
}

И соответствующий репозиторий (функция репозитория «findInventories ()» работает)в порядке):

public function findInventoriesBySearch($like, $filters)
{
    $em = $this->getEntityManager();
    $orExpr = $qb->expr()->orX();

    foreach ($filters as $filter)
    {
        $orExpr->add($qb->expr()->like($filter, $like));
    }

    $qb ->andWhere('i.checkedOutAt is NULL');
    $qb->setParameter('like', '%' . $like . '%');
    $qb->select('i')->where($orExpr)->addOrderBy('i.lastChangedAt', 'DESC');

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

При запуске сценария появляется следующее сообщение об ошибке:

Неустранимая ошибка: Uncaught Doctrine \ ORM \ Query \ QueryException: ВЫБРАТЬ i, ГДЕ стойка НРАВИТСЯ01 ИЛИ ПОЛНАЯ КАК 01 ЗАКАЗАТЬ по i.lastChangedAt DESC в ... / vendor / doctrine / orm / lib / Doctrine / ORM / Query / QueryException.php: 41 Трассировка стека: # 0 ... / vendor / doctrine / orm /lib / Doctrine / ORM / Query / Parser.php (483): Doctrine \ ORM \ Query \ QueryException :: dqlError ('SELECT i WHERE ...') # 1 ... / vendor / doctrine / orm / lib / Doctrine/ORM/Query/Parser.php(971): Doctrine \ ORM \ Query \ Parser-> semanticalError ('строка 0, столбец 15 ...', массив) # 2 ... / vendor / doctrine / orm / lib /Doctrine / ОРМ / Query / Parser.php (1702): Doctrine \ ORM \ Query \ Parser-> AbstractSchemaName () # 3 ... / vendor / doctrine / orm / lib / Doctrine / ORM / Query / Parser.php (1557): Doctrine \ ORM \ Query\ Parser-> RangeVariableDeclaration () # 4 ... / vendor / doctrine / orm / lib / Doctrine / ORM / Query / Parser.php (1292): Doctrine \ ORM \ Query \ Parser-> IdentificationVariableDeclaration () в .../vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php в строке 63

1 Ответ

0 голосов
/ 04 декабря 2018

Попробуйте проверить и изменить его.

  1. (Просто совет) Не работайте с $_POST / тип запроса / доступ к нему / и т. Д.через "твой путь".Используйте typehinted Request например:

    public function searchAction(Request $request){
    
       if ($request->isMethod('POST')) {
         $filters = $request->request->get('filters');
    
         //.....
       }else{
    
       }
    }
    
  2. Угадайте, проблема есть:

    //...
    foreach ($filters as $filter)
    {
       $filter = 'i.'.$filter; // <== 'i.rack','i.shelf', so on
       $orExpr->add($qb->expr()->like($filter, $like));
    }
    
...