Doctrine ODM 中的 AND 和 OR 表达式
Posted
技术标签:
【中文标题】Doctrine ODM 中的 AND 和 OR 表达式【英文标题】:AND and OR expression in Doctrine ODM 【发布时间】:2014-05-13 21:05:19 【问题描述】:我需要将 SQL 请求转换为 DQL 请求:
SELECT * FROM object WHERE stardate >= GETDATE() AND enddate <= GETDATE() OR stardate >= GETDATE() AND enddate IS NULL
我试过了:
$now = new \DateTime();
$qb = $this->createQueryBuilder()
->field('startDate')->lte($now)
->field('endDate')->gte($now);
$qb->addOr(
$qb->expr()
->field('startDate')->lte($now)
->field('endDate')->exists(false)
);
return $qb->getQuery()->execute();
但这是不正确的。
【问题讨论】:
【参考方案1】:解决办法:
$now = new \DateTime('01/01/2018');
$qb = $this->createQueryBuilder();
$qb->addOr(
$qb->expr()
->field('startDate')->lte($now)
->field('endDate')->gte($now)
);
$qb->addOr(
$qb->expr()
->field('startDate')->lte($now)
->field('endDate')->exists(false)
);
return $qb->getQuery()->execute();
【讨论】:
如果你直接使用 Doctrine Query Language 而不是 Query Builder 可能会更简单,因为它的语法非常接近 SQL。 docs.doctrine-project.org/projects/doctrine-orm/en/2.1/… 示例:SELECT x FROM YourProject\Model\YourTable WHERE x.stardate >= CURRENT_DATE() AND x.enddate <= CURRENT_DATE() OR x.stardate >= CURRENT_DATE() AND x.enddate IS NULL
事实上,DQL 似乎不适用于学说的 ODM(而不是 ORM)部分。
啊,好的。我错过了 ODM 部分。但这是有道理的。以上是关于Doctrine ODM 中的 AND 和 OR 表达式的主要内容,如果未能解决你的问题,请参考以下文章