2012-08-10 62 views
2

我正在構建一個小型Web應用程序,讓用戶預留Office Rooms和Equipment。對於預訂,他們輸入開始日期和結束日期。CakePHP在2個日期記錄之間搜索

當用戶試圖找出是否有任何(例如)汽車可在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)); 
+0

您應該檢查日期不應該在'startdate'和'enddate'。 http://nuts-and-bolts-of-cakephp.com/2008/06/30/between-and-sql-syntax-in-cakephp/ – 2012-08-10 10:33:38

+0

根據您提供的鏈接,我將代碼更改爲: ' '?之間? AND?' =>數組($ date,'Equipment.date_start','Equipment.date_end'), ' 不幸的是,什麼也沒做...... – Joshua 2012-08-10 14:36:45

回答

8

有一個簡單的解決方案,這一點,但感謝您的幫助:

(如查找:)條件

array('Equipment.date_start <= ' => $date, 
     'Equipment.date_end >= ' => $date 
    ), 
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

我只是好奇 - 找不到任何關於'dateRange'或start /以文檔,API或代碼結尾,你能提供一個鏈接嗎? – nappo 2012-08-10 11:37:45

+0

請檢查我的新代碼 – 2012-08-10 11:46:03

+0

http://nuts-and-bolts-of-cakephp.com/2008/06/30/between-and-sql-syntax-in-cakephp/請參閱這也 – 2012-08-10 12:00:24

1

在情況下,如果你有一個日期,要在其間

使用
$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)); 

這樣的話,如果你有往返於

你的情況

$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)); 
+0

太棒了:) – 2015-12-18 11:17:39

1

您不能對此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', 
    ), 
)); 

如果使用日期/時間函數,不引用他們。如果您使用特定的日期將其放在引號中。

1

這是CakePHP BETWEEN查詢示例。

我定義我的數組變量,然後用我的CakePHP中找到函數調用這些變量:

// 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