Я хочу создать запрос, используя 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