CakePHP 3 两个日期之间

CakePHP 3 Between two date

我尝试在我的控制器中进行查询,我想找到开始日期和结束日期在 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);
                          });

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

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

因为手册说 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');

从 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);
});