我在Extbase(TYPO3 8)中编写一个时间管理扩展。在我的模型中,我有两个属性开始日期和结束日期。现在,应该从这些属性计算持续时间并将其存储在数据库中。使用扩展程序生成器创建新属性 duration 后,我像这样更改了模型:
/**
* duration
*
* @var int
*/
protected $duration = 0;
/**
* Returns the duration
*
* @return int $duration
*/
public function getDuration()
{
return $this->duration;
}
/**
* Sets the duration
*
* @return void
*/
public function setDuration($duration)
{
return $this->duration = intval($this->enddate->format('U')) - intval($this->startdate->format('U'));
}
但是计算的时间未插入数据库中。
我在做什么错了?
答案 0 :(得分:1)
我认为您将持续时间存储到数据库中的方法已经错误。不要存储多余的信息!
您应该将字段startdate
和enddate
存储到数据库中,但不能存储持续时间,因为它可以即时计算。
冗余信息是故障和错误的典型来源。
答案 1 :(得分:0)
数据库中有一个“ duration”字段(或者如果以其他方式调用它-从持续时间到该名称是否存在映射?)。 另外:田间持续时间是否有TCA? 其他所有内容是否都按预期存储?如果不是这样,还请在模型被调用和持久化的地方发布您的代码(例如,控制器操作)。 如果您在持久之前调试对象怎么办?财产期限是否正确填写?
答案 2 :(得分:0)
您是否清除了TYPO3中的红色缓存(清除所有缓存)?更改模型后,这是必需的。
此外,在extbase中不会自动使用setter方法。
因此,如果您没有在代码中调用->setDuration()
,则根本不会调用它。
extbase的数据映射器使用方法_setProperty
来设置每个属性的值。
您可以在代码中调用方法->setDuration()
,以便写入数据库(更新/添加):
$model->setDuration(0);
$repository->add($model);
$model->setDuration(0);
$repository->update($model);
答案 3 :(得分:0)
您真正想要做的是根本不存储这些冗余信息。
/**
* Returns the duration
*
* @return int $duration
*/
public function getDuration()
{
return $this->getStartdate()->diff($this->getEnddate())->seconds;
}
答案 4 :(得分:-1)
您不需要将此类值存储在数据库中。您必须在TCA中将duration
配置为“ passthrough”。在模型中,您照常定义getter和setter。现在,您可以在控制器中计算持续时间,如下所示:
$start = $this->yourRepository->getStartdate();
$end = $this->yourRepository->getEnddate();
$duration = $end->format('U') - $start->format('U');
$this->yourRepository->setDuration( $duration);
您可以在initializeAction中执行此操作,以在每个操作中计算出值。