2015-07-10 26 views
0

我有一個突變:無法設置日期時間字段CakePHP的3

protected function _setPurchaseTime($purchase_time) { 
    return Time($purchase_time); 
} 

當我這樣設置值這個突變被運行良好:

$transaction->purchase_time = $this->request->data['purchase_time']; 

的突變正確得到$purchase_time。但是,當我試圖設置它是這樣的:

$transaction = $this->Transactions->patchEntity($transaction, $this->request->data); 

$purchase_time爲空。我無法弄清楚爲什麼會出現這種情況? mutator運行得很好,但變量爲空。

編輯:

我還要補充一點,purchase_time可訪問:

protected $_accessible = [ 
'ticker' => TRUE, 
'name' => TRUE, 
'market' => TRUE, 
'transaction_type' => TRUE, 
'price' => TRUE, 
'currency' => TRUE, 
'commission' => TRUE, 
'shares' => TRUE, 
'purchase_time' => TRUE 
]; 

編輯:增加了額外的數據

這是進入patchEntity數據:

[ 
    'ticker_label' => 'AAPL (Apple Inc.)', 
    'ticker' => 'AAPL', 
    'currency' => 'USD', 
    'market' => 'NASDAQ', 
    'transaction_type' => 'Buy', 
    'price' => '10', 
    'commission' => '10', 
    'shares' => '10', 
    'date' => 'Yesterday', 
    'purchase_time' => 'July 12, 2015 12:00', 
    'time' => '12:00', 
    'name' => 'Apple Inc.' 
] 

這是patchEntity運行後的數據:

object(App\Model\Entity\Transaction) { 
    'portfolio_id' => '43', 
    'ticker' => 'AAPL', 
    'currency' => 'USD', 
    'market' => 'NASDAQ', 
    'transaction_type' => 'Buy', 
    'price' => (float) 10, 
    'commission' => (float) 10, 
    'shares' => (float) 10, 
    'purchase_time' => (int) 1436803512, 
    'name' => 'Apple Inc.', 
    '[new]' => true, 
    '[accessible]' => [ 
    'ticker' => true, 
    'name' => true, 
    'market' => true, 
    'transaction_type' => true, 
    'price' => true, 
    'currency' => true, 
    'commission' => true, 
    'shares' => true, 
    'purchase_time' => true 
    ], 
    '[dirty]' => [ 
    'portfolio_id' => true, 
    'ticker' => true, 
    'currency' => true, 
    'market' => true, 
    'transaction_type' => true, 
    'price' => true, 
    'commission' => true, 
    'shares' => true, 
    'purchase_time' => true, 
    'name' => true 
    ], 
    '[original]' => [], 
    '[virtual]' => [], 
    '[errors]' => [], 
    '[repository]' => 'Transactions' 
} 

正如您所看到的,如果您在purchase_time字段中對Unix時間戳記進行了轉換,則它不等於輸入。它等於現在的時間,預計將NULL的值傳遞到Time()

+0

您可能有驗證錯誤 –

+0

@JoséLorenzo我現在沒有驗證,還沒有設置任何,因爲我想在我添加驗證之前首先得到這個工作。 –

+0

修補程序實體後調試($ transaction)的結果是什麼? –

回答

3

問題是CakePHP中的DatetimeType類預期輸入爲標準化格式。既可以作爲數組(格式輸入),也可以作爲ISO格式的字符串。

因爲你是在一個本地化的格式提供輸入,您可能需要enable the locale parser,發送輸入的ISO格式,然後將其轉換爲datetime,或延長DateTimeType類,以滿足您的需求轉換數據。

這樣做是使用Model.beforeMarshal事件的一個簡單的方法:

$table->eventManager()->on('Model.beforeMarshal', function ($event, $data) { 
    if (!empty($data['the_time_field']) { 
     $data['the_time_field'] = new Time($data['the_time_field']) 
    } 
}); 

要記住,數據沒有被設置爲實體,如果它不能正確地驗證這一點很重要,或者如果它不能爲「的解析」在類型類的幫助下通過Marshaller。這是使用patchEntity時不會調用setter的原因。

+0

謝謝José,這解決了setter不起作用的最初問題,並且實際上使setter完全冗餘。但它不能解決無法保存數據的問題。我調用了'patchEntity'後檢查了這個變量,並且它是一個時間對象,如預期的那樣。但是,保存到數據庫時,其他一切都可以很好地保存,但日期時間列設置爲'0000-00-00 00:00:00' –

+0

您可能設置了與該名稱不同的列的名稱數據庫中的列 –

+0

我已經驗證實體對象中的值的名稱是'purchase_time',並且數據庫中的列的名稱是'purchase_time',我不確定在哪裏可以誤解某些內容? –

相關問題