【问题标题】:CakePHP 3 Between two dateCakePHP 3 两个日期之间
【发布时间】:2016-06-23 07:45:05
【问题描述】:

我尝试在我的控制器中进行查询,我想找到开始日期和结束日期在 NOW() 之间的所有实体, 如果 $start 和 $end 介于 NOW() 之间,则显示所有实体,但我没有成功

我的发现是:

$day = date('l');
$now = Time::now();
$tvs = $this->Tvs
         ->find('all')
         ->contain(['Users'])
         ->where(['Tvs.day' => $day])
         ->andWhere(function($exp) {
               return $exp->between($now, 'Tvs.start', 'tvs.end', $now);
                          });

如何进行此查询? 感谢您的帮助!

【问题讨论】:

  • 你的意思是:$nowstartend 之间,我猜。

标签: orm cakephp-3.0 between


【解决方案1】:

假设您正在尝试查找在startend 之间具有$now 的所有记录,则查询是

sice 手册说 between 函数的第一个参数应该是字段的名称(所以它不能是日期)而不是 between 你可以使用两个比较

$tvs = $this->Tvs
    ->find('all')
    ->contain(['Users'])
    ->where(['Tvs.day' => $day])
    ->andWhere(function($exp) use($now) {
        $exp->lte('Tvs.start', $now);
        $exp->gte('Tvs.end', $now);
        return $exp;
     });

无论如何,如果 $now 变量包含与 NOW() 函数相同的值,您可以直接在查询中使用 mysql NOW() 函数

->andWhere(function($exp, $q) {
     return $exp->between($q->func()->now(), 'Tvs.start', 'Tvs.end');
});

还有一个方法:你可以使用 BETWEEN 和一个占位符来绑定 $now 的值

 ->andWhere([':now BETWEEN Tvs.start AND Tvs.end'])
 ->bind(':now', $now, 'datetime');

或使用 cakephp sql 函数

->where(function($exp, $q) {
    return $exp->between(':now', 'Tvs.start', 'Tvs.end');
})
->bind(':now', $now, 'datetime');

【讨论】:

  • 是的,这个函数是正确的,但是我的 $now 是 Time::now();我有一个错误 SQL --> 在 '09:34 附近使用,我认为两者之间不采用日期格式 Y-m-d H:i:s
  • 我查看了 between() 文档。查看我的编辑
  • 感谢您的帮助,我阅读了文档并了解查询生成器,它的工作!
  • 我添加了第三种解决方案
【解决方案2】:

从 CakePHP 3.6 开始,您可以使用标识符:

return $query->where(function ($exp, $q) {
    
    $today = $q->func()->now();
    $start = $q->identifier('Tvs.start');
    $end   = $q->identifier('Tvs.end');
    
    return $exp
        ->between($today,$start,$end);
});

【讨论】:

  • 这是一个很好的解决方案。但是,如果您的 MySQL 数据库存储在不同的服务器上,或者配置了不同的时区,那么您需要考虑其他解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
相关资源
最近更新 更多