我有一个对象appointment
,其属性expertises
的类型为\TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Vendor\Extname\Domain\Model\Expertise>
此外,Expertise
的一个重要属性是bool checked
。
我想在AppointmentController中做的是:
appointment
的属性expertises
(未将其设置为NULL
,我只想要一个空的ObjectStorage
,我可以添加一些内容稍后)appointment
(来自其他对象)填充expertises
,其属性checked
等于true
开始清空时,我查看了here的答案,但这对我不起作用。
这就是我试过的:
$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);
}
}
它有效,但我想知道是否有一个更简单的“过滤器”功能可以自动过滤checked
值并返回ObjectStorage
对象。因为这样我就可以使用setExpertises()
而旧的那些会被覆盖,这将使第一步不必要。
那么有人知道清空和过滤ObjectStorage
个对象吗?
我看了一下ObjectStorage Class reference但是没有明显的功能可以清空它(removeAll
仅用于包含在当前存储的另一个存储中的对象)并且没有过滤功能
答案 0 :(得分:1)
有一种简单的方法可以从对象存储中删除所有对象:
$appointment->getExpertises()->removeAll($appointment->getExpertises());
关于过滤:正如您已经注意到的,您必须自己完成。我会在模型中实现像getActiveExpertises
这样的函数,因为它比在控制器中更适合。
答案 1 :(得分:0)
ExtbaseObjects中指向ObjectStorage的设置器具有默认为null的可选参数。只需调用不带参数的设置器即可。您不必通过实例化一个空的StorageObject来浪费性能。
$appointment->setExpertises();