首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法设置日期时间字段CakePHP 3

无法设置日期时间字段CakePHP 3
EN

Stack Overflow用户
提问于 2015-07-10 02:06:26
回答 1查看 2.4K关注 0票数 0

我有个突变者:

代码语言:javascript
运行
复制
protected function _setPurchaseTime($purchase_time) {
    return Time($purchase_time);
}

当我像这样设置值时,这个mutator运行得很好:

代码语言:javascript
运行
复制
$transaction->purchase_time = $this->request->data['purchase_time'];

变送器正确地获得$purchase_time。但当我试图把它设置成这样:

代码语言:javascript
运行
复制
$transaction = $this->Transactions->patchEntity($transaction, $this->request->data);

$purchase_time为空。我搞不懂为什么会这样?mutator运行得很好,但是变量为null。

编辑:

我还要补充一点,purchase_time是可访问的:

代码语言:javascript
运行
复制
protected $_accessible = [
 'ticker' => TRUE,
 'name' => TRUE,
 'market' => TRUE,
 'transaction_type' => TRUE,
 'price' => TRUE,
 'currency' => TRUE,
 'commission' => TRUE,
 'shares' => TRUE,
 'purchase_time' => TRUE
];

编辑:添加额外数据

这是进入patchEntity的数据:

代码语言:javascript
运行
复制
[
  '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之后的数据:

代码语言:javascript
运行
复制
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()时,这是预期的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-15 09:57:56

问题是,DatetimeType类在CakePHP中需要标准化格式的输入。作为数组(表单输入)或ISO格式的字符串。

由于您是以本地化格式提供输入,所以您需要启用地区解析器、以ISO格式发送输入、在数据转换为日期时间之前转换数据,或者扩展DateTimeType类以满足您的需要。

这样做的一个简单方法是使用Model.beforeMarshal事件:

代码语言:javascript
运行
复制
$table->eventManager()->on('Model.beforeMarshal', function ($event, $data) {
    if (!empty($data['the_time_field']) {
        $data['the_time_field'] = new Time($data['the_time_field'])
    }
});

重要的是要记住,如果数据不能被正确验证,或者不能在Type类的帮助下被Marshaller“解析”,数据就不会被设置为实体。这就是为什么在使用patchEntity时没有调用setter的原因。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31331334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档