cakephp 如何使用日期格式处理查询构建器

yqkkidmi  于 2022-11-11  发布在  PHP
关注(0)|答案(2)|浏览(117)

我只想显示startdate从明天开始的事件。我该如何继续?目前它还考虑了h:i:s。

public function display()
{
    $now = date('Y-m-d H:i:s');

    $this->loadModel('Events');
    $events = $this->Events
        ->find()
        ->contain(['Categories', 'Venues'])
        ->limit(5)
        ->order(['events.startdate' => 'ASC'])
        ->where(['events.startdate >' => $now]);
    $this->set('upcomingEvents', $events);
}

我试过了,但不起作用:

public function display()
{
    $now = date('Y-m-d');

    $this->loadModel('Events');
    $events = $this->Events
        ->find()
        ->contain(['Categories', 'Venues'])
        ->limit(5)
        ->order(['events.startdate' => 'ASC'])
        ->where(['date_format("%Y-%m-%d", events.startdate)' => $now]);
    $this->set('upcomingEvents', $events);
}
xkrw2x1b

xkrw2x1b1#

不需要在查询中格式化日期并丢失索引功能,而是与使用00:00:00作为时间部分(例如,一天的开始)的日期时间字符串进行比较。
使用date('Y-m-d 00:00:00')可以轻松地实现这一点,但这是今天的事,而不是明天的事,您需要为date()提供一个时间戳,如date('Y-m-d 00:00:00', strtotime('+1 day'))
您还可以使用CakePHP附带的日期时间功能。现在\Cake\Chronos\Date::tomorrow()将创建一个日期对象来表示2021-10-06,其中的时间部分将始终为00:00:00

->where(['Events.startdate >=' => \Cake\Chronos\Date::tomorrow()])

ORM将根据列类型自动格式化日期对象,因此对于您的“我假设为DATETIME”列,它将在SQL中最终显示为2021-10-06 00:00:00
另请参阅



5uzkadbs

5uzkadbs2#

不确定这是否是正确的继续方式,但它使用函数DATA_FORMAT()

DATE_FORMAT(events.startdate, "%Y-%m-%d")

下面是查询:

public function display()
{
    $now = date('Y-m-d');

    $this->loadModel('Events');
    $events = $this->Events
        ->find()
        ->contain(['Categories', 'Venues'])
        ->limit(5)
        ->order(['events.startdate' => 'ASC'])
        ->where(['DATE_FORMAT(events.startdate, "%Y-%m-%d") >' => $now]);

    $this->set('upcomingEvents', $events);
}

或者我们也可以在条件数组中使用

public function display()
{
    $this->loadModel('Events');
    $events = $this->Events
    ->find('all', array('conditions' => array('DATE_FORMAT(events.startdate, "%Y-%m-%d") >' => date('Y-m-d'))))
    ->contain(['Categories', 'Venues'])
    ->limit(5)
    ->order(['events.startdate' => 'ASC']);

    $this->set('upcomingEvents', $events);
}

相关问题