TYPO3 Extbase-计算属性并添加到数据库

时间:2018-12-29 12:52:20

标签: model typo3 extbase typo3-8.x

我在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'));
}

但是计算的时间未插入数据库中。

我在做什么错了?

5 个答案:

答案 0 :(得分:1)

我认为您将持续时间存储到数据库中的方法已经错误。不要存储多余的信息!

您应该将字段startdateenddate存储到数据库中,但不能存储持续时间,因为它可以即时计算。

冗余信息是故障和错误的典型来源。

答案 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中执行此操作,以在每个操作中计算出值。