【问题标题】:Doctrine equivalent of in() expression with dates带日期的 in() 表达式的学说
【发布时间】:2020-01-31 21:49:48
【问题描述】:

使用 Doctrine 的 QueryBuilder,我尝试在日期数组上使用 in() 方法,但我发现它只允许字符串值。

/** @param DateTime[] $dates */
public function findByDate(array $dates): array {
    $qb = $this->createQueryBuilder('Event');
    $qb->andWhere($qb->expr()->in('Event.date', ':dates'));
    $qb->setParameter('dates', $dates);
    return $qb->getQuery()->getResult();
}

使用参数 [{"date":"2020-01-31 00:00:00.000000","timezone_type":3,"timezone":"Europe/ 执行 'SELECT [...]' 时发生异常柏林"}]:
可捕获的致命错误:DateTimeImmutable 类的对象无法转换为字符串

是否有任何简单的等价于 in() 函数的日期? (最好不要使用 DQL)

【问题讨论】:

  • Related. 我建议使用 kejwmen 那里建议的array_map 方法。很简单。
  • @Jeto 当然...但是我们可以确定Y-m-d H:i:s 格式适用于任何数据库实现/发行版/设置(它是一种 SQL 标准吗?),或者它可能会因数据库服务器?
  • 当然,这种方式可能不太便携。我对 Doctrine 知之甚少,但可能有一种方法可以强制列的日期格式,然后在执行上述操作时可能会检索它。无论如何,您的解决方案对我来说看起来不错(您可能想尝试使其更通用并将其发布在该 github 问题上)。
  • 好主意 :) 添加了对该问题的评论

标签: php doctrine query-builder


【解决方案1】:

这是我想出的解决方案,循环遍历 PHP 数组,构建另一个 eq() 表达式数组,然后 oring 一切。 它完成了它的工作,但需要在数组中为每个日期声明一个参数,而不是单个数组参数。

如果你找到更好的方法,请告诉我...

/** @param DateTime[] $dates */
public function findByDate(array $dates): array {
    $qb = $this->createQueryBuilder('Event');
    $criteria = [];
    for($i = 0; $i < count($dates); $i++) {
        $criteria[] = $qb->expr()->eq('Event.date', ":date_$i");
        $qb->setParameter("date_$i", $dates[$i]);
    }
    $qb->andWhere($qb->expr()->orX()->addMultiple($criteria));
    return $qb->getQuery()->getResult();
}

【讨论】:

    猜你喜欢
    • 2019-04-21
    • 2012-03-28
    • 2013-08-16
    • 2012-09-24
    • 2023-01-14
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    相关资源
    最近更新 更多