php - 如何使用 Doctrines Query Builder 定义多个 orWhere 查询
问题描述
我想使用 Doctrines QueryBuilder 创建一个查询。
用户可以通过选中或取消选中 HTML 表单中的复选框来选择应搜索的数据库字段。这就是为什么$_POST contains 'filters'
和“喜欢”。
$_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`
我在版本 2.5.5 中使用 Doctrine,在版本 7 中使用 PHP。我的控制器如下所示:
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();
}
当我运行脚本时,我收到以下错误消息:
致命错误:未捕获的 Doctrine\ORM\Query\QueryException: SELECT i WHERE rack LIKE 01 OR Shelf LIKE 01 ORDER BY i.lastChangedAt DESC in .../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('line 0, col 15 ...' , 数组) #2 .../vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php(1702): Doctrine\ORM\Query\Parser->AbstractSchemaName() #3 .../vendor/教义/orm/lib/Doctrine/ORM/Query/Parser.php(1557): Doctrine\ORM\Query\Parser->RangeVariableDeclaration() #4 .../vendor/doctrine/orm/lib/Doctrine/ORM/Query /解析器.php(1292):Doctrine\ORM\Query\Parser->IdentificationVariableDeclaration() in .../vendor/doctrine/orm/lib/Doctrine/ORM/Query/QueryException.php 第 63 行
解决方案
尝试检查并更改它。
(只是,一个建议)不要使用
$_POST
/请求类型/访问它/等。通过“你的方式”。使用类型提示,Request
例如:public function searchAction(Request $request){ if ($request->isMethod('POST')) { $filters = $request->request->get('filters'); //..... }else{ } }
猜猜,问题出在:
//... foreach ($filters as $filter) { $filter = 'i.'.$filter; // <== 'i.rack','i.shelf', so on $orExpr->add($qb->expr()->like($filter, $like)); }
推荐阅读
- angular - 在组件中处理成功的动作调度
- sql - SSRS 饼图图例
- events - 如何向 Splunk 中的事件添加自定义字段?
- sumo - 如何在 SUMO 模拟中获得角速度
- php - Guzzle *70 recv() 失败(104:对等方重置连接)
- javascript - 如何使用 for 循环在 jquery 中追加数据?
- ruby-on-rails - 使用不同的外键引用相同的模型两次或创建多对多关联
- apache-spark - 在提交通过 pyspark 代码连接 hbase 的 spark 作业期间获取“IOException:Broken pipe”
- spring-boot - What is the proper dependency configuration for Vaadin CssLayout
- excel - 使用 Excel 创建 Visio ER 图