CakePHP 在 2 个日期记录之间搜索

Posted

技术标签:

【中文标题】CakePHP 在 2 个日期记录之间搜索【英文标题】:CakePHP Search between 2 Date Records 【发布时间】:2012-08-10 09:51:20 【问题描述】:

我正在构建一个小型 Web 应用程序,让用户可以预订办公室和设备。对于预订,他们输入开始和结束日期。

当用户试图找出是否有任何(例如)汽车在 2012 年 10 月 23 日可用,并且数据库保存开始:2012-10-20 和结束:2012-10-25 的预订日期记录(比如说)所有的汽车,我如何在搜索中包含我的日期条目之间的所有日期?

$date 变量从日期搜索表单字段中获取它的值。

不幸的是,这不起作用,我不知道如何使用 daysAsSql 进行此查询:

$conditions = array(
    'conditions' => array(
        '? BETWEEN ? AND ?' => array($date,'Equipment.date_start','Equipment.date_end'), 
    )));

$this->set('equipments', $this->Equipment->find('all', $conditions));

【问题讨论】:

你应该检查日期不应该在startdateenddate之间。 nuts-and-bolts-of-cakephp.com/2008/06/30/… 根据您提供的链接,我将代码更改为:` '?之间 ?和 ?' => array($date,'Equipment.date_start','Equipment.date_end'), ` 不幸的是,这没有任何作用…… 【参考方案1】:

有一个更简单的解决方案,但感谢您的帮助:

(作为查找中的一个条件:)

array('Equipment.date_start <= ' => $date,
      'Equipment.date_end >= ' => $date
     ),

【讨论】:

【参考方案2】:

如果你有一个日期并且你想使用 BETWEEN

$date_start = start date;
$date_end = date_end;

$conditions = array(
    'conditions' => array(
        'date(Equipment.create) BETWEEN ? AND ?' => array($date_start, $date_end), 
    )));

$this->set('equipments', $this->Equipment->find('all', $conditions));

如果您有 From AND To,就会出现这种情况

你的情况

$date_start = start date;
$date_end = date_end;

$conditions = array(
    'conditions' => array(
        'Equipment.start_date >=' => array($date_start), 
        'Equipment.end_date <=' => array($date_end)
    ));

$this->set('equipments', $this->Equipment->find('all', $conditions));

【讨论】:

【参考方案3】:

这里是CakePHP BETWEEN 查询示例。

我将我的数组定义为变量,然后在我的 CakePHP find 函数调用中使用这些变量:

// just return these two fields
$fields = array('uri', 'page_views');

// use this "between" range
$conditions = array('Event.date BETWEEN ? and ?' => array($start_date, $end_date));

// run the "select between" query
$results = $this->Event->find('all', 
         array('fields'=>$fields, 
               'conditions'=>$conditions));

Ref from

【讨论】:

【参考方案4】:
$start = date('Y-m-d');
$end = date('Y-m-d', strtotime('+1 month'));

$conditions = array('Event.start <=' => $end, 'Event.end >=' => $start);

$this->Event->find('all', array('conditions' => $conditions));

【讨论】:

我只是好奇 - 在文档、api 或代码中找不到关于 dateRange 或开始/结束的任何信息,能否提供链接? nuts-and-bolts-of-cakephp.com/2008/06/30/… 也参考这个【参考方案5】:

如果您使用的是 cakephp 2.0,这就是答案 http://book.cakephp.org/2.0/en/core-libraries/helpers/time.html#TimeHelper::daysAsSql

如果您使用的是 cakephp 1.3,您可以使用 TimeHelper,只需导入它并使用与此处文档中的示例相同的功能 http://book.cakephp.org/1.3/en/view/1471/Formatting

【讨论】:

谢谢,我知道这些文档,但我无法让 daysAsSql 使用它。 (我在 CakePHP 2 上)【参考方案6】:

您不能将数据库列与此 BETWEEN-syntax 一起使用。如果您在数组中分配字符串,CakePHP 将引用它们。数值相同,具体取决于您的数据库设置。

CakePHP 将根据数据库中的字段类型引用数值。 – 见http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#complex-find-conditions

如果您仍想使用BETWEEN,您可以将查询写入数组键,因为 CakePHP 不会转义键,只会转义值。

CakePHP 只对数组值进行转义。您应该绝不将用户数据放入密钥中。这样做会使您容易受到 SQL 注入的攻击。 – 见http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#complex-find-conditions

关于你的问题:

$this->Model->find('all', array(
    'conditions' => array(
        '"YYYY-MM-DD" BETWEEN Model.date_start AND Model.date_end',
    ),
));

您甚至可以使用 mysql 日期和时间函数:

$this->Model->find('all', array(
    'conditions' => array(
        'CURDATE() BETWEEN Model.date_start AND Model.date_end',
    ),
));

如果您使用日期/时间函数,请不要引用它们。如果您使用特定日期,请将其放在引号中。

【讨论】:

以上是关于CakePHP 在 2 个日期记录之间搜索的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP 1.2 应用程序具有非常规的 Cake 路径抛出错误

调用未定义的方法 Cake\ORM\Entity::query() CakePhp

SQL 中 2 个日期之间的 SQL 搜索

CakePHP 中的多重计数

CakePhp : Cake bake 在 Ubuntu 上不起作用。 (PDO异常)

php [cakephp:MediaController]用文件二进制文件返回cake的响应对象。 #cakephp