【问题标题】:AND and OR expression in Doctrine ODMDoctrine ODM 中的 AND 和 OR 表达式
【发布时间】: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();

但这是不正确的。

【问题讨论】:

    标签: symfony doctrine dql doctrine-odm odm


    【解决方案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 部分。但这是有道理的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多