symfony - 带有 AND 和 OR 的查询生成器
问题描述
我在Symfony 3.4 flex中工作,我需要像这样做一个查询构建器:
所有在 True AND 媒体上带有“已发布”的媒体都是TYPE OF :type AND ((condition 1) OR (condition 2) OR (condition 3))
带有 symfony 学说查询构建器。这 2 个条件已经成立(已发布和 :instance 的实例):
$queryBuilder = $this->createQueryBuilder('m')
->chere('m.published = :published')
->andWhere('m INSTANCE OF :instance');
/*
WHERE m.published = true AND m INSTANCE OF :instance
AND (
// ('m.startDate <= :today AND m.endDate >= :today')
// OR ('m.startDate IS NULL AND m.endDate >= :today')
// OR ('m.startDate IS NULL AND m.endDate IS NULL')
// OR ('m.startDate <= :today AND m.endDate IS NULL')
*/
当我尝试类似:
$queryBuilder->andWhere($queryBuilder->expr()->andX(
$queryBuilder->expr()->lte('m.startDate', ':today'),
$queryBuilder->expr()->gte('m.endDate', ':today'))
);
但它不起作用,它返回如下内容:
WHERE (
(m.published = 1 AND m.type IN (:type)) // I already needed this in all cond
AND m.start_date <= :today AND m.end_date >= :today // cond 1
)
OR (m.start_date IS NULL :today AND m.end_date IS NULL) // cond 2
OR ... // cond 3
所以我的条件((m.published = 1 AND m.type IN (:type)))
需要在所有条件下不仅仅是第一个
你有什么主意吗 ?
谢谢。
解决方案
你可以这样做:
$queryBuilder = $this->createQueryBuilder('m')
->where("((m.published = true AND m INSTANCE OF :instance) AND
(
(m.startDate <= :today AND m.endDate >= :today) OR
(m.startDate IS NULL AND m.endDate >= :today) OR
(m.startDate IS NULL AND m.endDate IS NULL) OR
(m.startDate <= :today AND m.endDate IS NULL)
)
)"
);
推荐阅读
- ios - URLSession - 最佳并行任务数
- php - 如何在 php 中循环遍历此 json 响应并在每次循环后执行操作
- c# - 了解由以下代码段生成的 IL
- sql-server - 任何人都知道如何使用 SQL 来执行此操作并替换连字符和掩码
- sql - 查找特定值并转译
- mysql - SQL Query Prestashop:如何过滤组合?
- iterator - 从选项到迭代器
- python - 如何使用无头硒从 div 类中提取文本
- java - 向 AWS ElasticSearch 添加 5000 万条记录的最快方法
- android - 如何使用 Flutter 在 iOS 和 Android 中获取正在运行的应用程序信息?