2015-07-10 79 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',我不确定在哪里可以误解某些内容? –

相关问题