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 &gt;= CURRENT_DATE() AND x.enddate &lt;= CURRENT_DATE() OR x.stardate &gt;= CURRENT_DATE() AND x.enddate IS NULL 事实上,DQL 似乎不适用于学说的 ODM(而不是 ORM)部分。 啊,好的。我错过了 ODM 部分。但这是有道理的。

以上是关于Doctrine ODM 中的 AND 和 OR 表达式的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别