空 and/or 过滤 ObjectStorage 对象

Empty and/or Filter ObjectStorage objects

我有一个对象 appointment,其 属性 expertises 类型为 \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Vendor\Extname\Domain\Model\Expertise>
另外 Expertise 的一个重要 属性 是 bool checked

我想在我的 AppointmentController 中做的是:

  1. 第一个动作:清空appointment的属性 expertises(不是设置成NULL,我只想要一个空的ObjectStorage我可以稍后添加一些东西)
  2. 在第二个操作中:用expertises(来自不同的对象)填充appointment,其属性 checked等于true

从清空开始,我查看了 的答案,但它对我不起作用。
这是我试过的:

 $appExp = $appointment->getExpertises();
 foreach ($appExp as $exp) {
     $appExp->detach($exp);
 }     
 \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($appointment);

但是显示所有expertises还在appointment.

在第二个动作中我这样做:

foreach ($expertises as $expertise) {
    if ($expertise->getChecked()) {
        $appointment->addExpertise($expertise);
    }
}

有效,但我想知道是否有更简单的 "filter" 函数可以自动过滤 checked 值和 return 一个 ObjectStorage 对象。因为这样我就可以只使用 setExpertises() 而旧的会被覆盖,这将使第一步变得不必要。

那么有人对 ObjectStorage 对象的清空和过滤有想法吗? 我查看了一下 ObjectStorage Class reference 但没有明显的函数可以清空它(removeAll ist 仅适用于当前存储 中另一个存储中包含的 对象)并且没有过滤功能。

有一种简单的方法可以从对象存储中删除所有对象:

$appointment->getExpertises()->removeAll($appointment->getExpertises());

至于过滤:正如您已经注意到的,您必须自己做。我会在模型中实现像 getActiveExpertises 这样的功能,因为它比在控制器中更适合那里。

ExtbaseObjects 中引用 ObjectStorages 的 setters 有一个默认为 null 的可选参数。只需调用不带参数的 setter 即可。您不必通过实例化一个空的 StorageObject 来浪费性能。

$appointment->setExpertises();