CakePHP在两个日期记录之间进行搜索

3
我正在开发一个小型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 之间。http://nuts-and-bolts-of-cakephp.com/2008/06/30/between-and-sql-syntax-in-cakephp/ - Arun Jain
根据您提供的链接,我将代码更改为:'? BETWEEN ? AND ?' => array($date,'Equipment.date_start','Equipment.date_end'),不幸的是,这并没有起到任何作用... - Joshua
6个回答

11

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

(在 find 条件中使用)

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

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


3

如果您只有一个日期,并且想要使用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和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));

2
$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));

2
我只是好奇 - 在文档、API或代码中找不到有关dateRange或起始/结束的任何信息,你能提供一个链接吗? - nappo
请参考以下链接:http://nuts-and-bolts-of-cakephp.com/2008/06/30/between-and-sql-syntax-in-cakephp/ - Anooj P

1

谢谢,我知道文档,但是我无法让daysAsSql在这个上工作。(我使用的是CakePHP 2) - Joshua

1
您不能在使用此BETWEEN语法时使用数据库列。如果将字符串分配给数组,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的日期和时间函数:

您可以使用MySQL的日期和时间函数:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接