2013-01-09 47 views
-1

我使用表單助手來顯示下拉選擇日期。我的問題是,我無法將ms sql中的日期與表單數據進行比較。CakePHP:從表單助手搜索日期

筆者認爲:

<?php echo $this->Form->input('collect_date', array('label' => 'Collect Date','type'=>'date','dateFormat'=> 'DMY','minYear' => date('Y'),'maxYear' => date('Y')+1));?> 

我的控制器

$status =array(0,2,4); 
$find_date = $this->data['Transaction']['collect_date']; 
$field = array('Transaction.status','Catalogue.title', 'Catalogue.author', 'Catalogue.isbn', 'Location.rack'); 
$condition = array('OR' => array('AND' =>array('Transaction.return_date <'=> $find_date,'Transaction.status '=> '3'),array('Transaction.status'=> $status))); 
$data = $this->Catalogue->Transaction->find('count',array('fields' => $field,'conditions'=>$condition,'order'=>array('Transaction.id desc'))); 
$this->set('Found', $data); 

和SQL轉儲

SELECT COUNT(*) AS [count] FROM [transactions] AS [Transaction] 
LEFT JOIN [catalogues] AS [Catalogue] ON ([Transaction].[catalogue_id] = [Catalogue].[id]) 
LEFT JOIN [users] AS [User] ON ([Transaction].[user_id] = [User].[id]) 
WHERE (((([Transaction].[return_date] < ('01', '09', 2013)) 
AND ([Transaction].[status] = 3))) OR ([Transaction].[status] IN (0, 2, 4))) 

正如你所看到的日期格式( '01', '09', 2013)。但是,當嘗試使用轉換這個

'Transaction.return_date <'=> date('Y-m-d', strtotime($find_date)) 

它顯示錯誤:

Warning (2): strtotime() expects parameter 1 to be string, array given [APP\Controller\CataloguesController.php, line 66] 

和SQL顯示:

[Transaction].[return_date] < '1970-01-01' 

回答

0

你可以使用:

$date = DateTime::createFromFormat('d/m/y', implode('/', $find_date)); 
'Transaction.return_date <'=> $date->format('Y-m-d'); 

編輯:

我的思維方式它的意思是「扁平化」是

$this->Model->deconstruct('find_date', $find_date); 

但是,我最後一次試圖利用這一點,我不能讓它正常工作,所以我就用上面的。 http://api21.cakephp.org/class/model#method-Modeldeconstruct

+1

@Eion:我建立了一個PR來使用解構器,如你所建議的:https://github.com/cakephp/cakephp/pull/842--但其他人不太喜歡它;)無論如何,要在這裏解構工作,您需要將該字段添加到模型的模式中。 – mark

+0

我喜歡只有一種方法來解構它的想法。我使用的是mongo atm,我不喜歡必須指定我的模式的想法,因爲它會干擾保存的內容並破壞一些mongos的靈活性。 –

+0

好吧,我的公關既是方法也是更自動的。也許,如果它只是它值得添加到內核的方法? – mark

0

嘗試在SQL查詢中使用UNIX_TIMESTAMP轉換返回日期,然後將其與 strtotime($ find_date)進行比較。