symfony - 如何在学说查询生成器中使用 orWhere inside andWhere
问题描述
我想创建一个搜索,您可以在其中选择几个城市和这样的选项。
SELECT * FROM `company` WHERE (`city_id` = 4 OR `city_id` = 5) AND (`option` = 1 OR `option` = 2)
我怎样才能在教义中做到这一点?
/**
* @param CompanyAdminSearch $search
* @return Query
*/
public function findVisibleQuerySupplierSearch(CompanyAdminSearch $search): Query
{
$query = $this->findVisibleQuerySupplier();
if ($search->getCity()->count() > 0){
$k = 0;
foreach ($search->getCity() as $k => $city){
$k++;
$query = $query
->andWhere($query->expr()->orX("company.city = :city$k"))
->setParameter("city$k", $city);
}
}
if ($search->getOptions()->count() > 0) {
$k = 0;
foreach ($search->getOptions() as $k => $option){
$k++;
$query = $query
->andWhere(":option$k MEMBER OF company.options")
->setParameter("option$k", $option);
}
}
return $query->getQuery();
}
private function findVisibleQuerySupplier(): QueryBuilder
{
return $this->createQueryBuilder('company')
->andWhere('company.metier = :metier')
->setParameter('metier', true)
;
}
我尝试使用 orX,但它不起作用。
有人能帮我吗?
解决方案
WHERE (`city_id` = 4 OR `city_id` = 5) AND ...
可以重写为WHERE `city_id` IN (4, 5) AND ...
这将大大简化您的查询构建器并提供相同的结果。
您现在可以使用:
if ($search->getCity()->count() > 0) {
$citiesId = [];
foreach ($search->getCity() as $city) {
$citiesId[] = $city; // get the cities in an array
}
// no need to write $query = $query->...
$query->andWhere("company.city IN (:cities)") // use IN clause
->setParameter(":cities", $citiesId); // and bind the array as parameter
}
您现在可以对option
其他东西应用相同的逻辑
我不知道是什么$search->getCity()
样子,但我觉得你可以使用
if ($search->getCity()->count() > 0) {
$query->andWhere("company.city IN (:cities)")
->setParameter(":cities", $search->getCity());
}
推荐阅读
- html - 有没有办法使用 CSS 为我拥有的这个水平菜单创建一个下拉菜单?我试图在“文章”部分创建下拉菜单
- java - 打开堆转储时,Android Studio 中的 Profiler 为空白
- c# - C# Web API - 当我没有传递所有查询字符串参数时收到错误消息
- javascript - 如何在核心 JavaScript 中将新日期对象格式化为 MySQL 格式 YYYY-MM-DD hh-mm-ss?
- javascript - 如何使用 cookie 将 javascript 变量传递给 php 变量
- parameters - 如何通过网格搜索绘制 AUC 以获得最佳超参数
- node.js - 尝试将用于 web 的 Node.js React 应用程序部署到 Heroku 或 Github Pages,它可以在本地工作,而不能在 Heroku 上工作。为什么?
- reactjs - 我如何在 reactjs 中实现这一点而不替换新触发器中的第一个触发器崩溃
- bash - BASH:子命令扩展中不可避免的分词?
- mysql - 是否有用于存储原材料、中间产品和最终产品的 MYSQL 表模式?