使用 AND 和 OR 的查询构建器
Query builder with AND and OR
我在 Symfony 3.4 flex 工作,我需要像这样做一个查询生成器:
所有带有“published”的媒体为 True AND media 是 TYPE OF :type AND ((condition 1) OR (condition 2) OR (condition 3))
with a symfony doctrine query builder .这 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'))
);
但它不起作用 return 像 :
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)
)
)"
);
据你所知,使用 DQL,它会是这样的:
//Important to have it initialized alone so you can use it for expressions
$qb=$this->createQueryBuilder('m');
$qb->andWhere($qb->expr()->andX(
"m.published=1",
"m INSTANCE OF :instance",
$qb->expr()->orX(
$qb->expr()->andX("m.startDate <= :today", "m.endDate >= :today"),
$qb->expr()->andX("m.startDate IS NULL", "m.endDate >= :today"),
$qb->expr()->andX("m.startDate IS NULL", "m.endDate IS NULL"),
$qb->expr()->andX("m.startDate <= :today", "m.endDate IS NULL")
)
))
->setParameters(array(
'instance'=>$instance,
'today'=>$today,
))
->getQuery()
->execute();
它将为您提供以下 DQL 查询:
SELECT m
FROM AppBundle\Entity\Media m
WHERE m.published=1
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))
一些小技巧:
永远不要使用 where()
或 orWhere
,它总有一天会给你带来麻烦
您可以阅读更多相关信息 here
始终对您的查询使用双引号。
Doctrine 只接受查询中字符串的单引号
我在 Symfony 3.4 flex 工作,我需要像这样做一个查询生成器:
所有带有“published”的媒体为 True AND media 是 TYPE OF :type AND ((condition 1) OR (condition 2) OR (condition 3))
with a symfony doctrine query builder .这 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'))
);
但它不起作用 return 像 :
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)
)
)"
);
据你所知,使用 DQL,它会是这样的:
//Important to have it initialized alone so you can use it for expressions
$qb=$this->createQueryBuilder('m');
$qb->andWhere($qb->expr()->andX(
"m.published=1",
"m INSTANCE OF :instance",
$qb->expr()->orX(
$qb->expr()->andX("m.startDate <= :today", "m.endDate >= :today"),
$qb->expr()->andX("m.startDate IS NULL", "m.endDate >= :today"),
$qb->expr()->andX("m.startDate IS NULL", "m.endDate IS NULL"),
$qb->expr()->andX("m.startDate <= :today", "m.endDate IS NULL")
)
))
->setParameters(array(
'instance'=>$instance,
'today'=>$today,
))
->getQuery()
->execute();
它将为您提供以下 DQL 查询:
SELECT m
FROM AppBundle\Entity\Media m
WHERE m.published=1
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))
一些小技巧:
永远不要使用 where()
或 orWhere
,它总有一天会给你带来麻烦
您可以阅读更多相关信息 here
始终对您的查询使用双引号。 Doctrine 只接受查询中字符串的单引号