首页 > 解决方案 > 带有 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)))需要在所有条件下不仅仅是第一个

你有什么主意吗 ?

谢谢。

标签: symfonydoctrinequery-builder

解决方案


你可以这样做:

 $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)
                      )
                 )"
               );

推荐阅读