清空和/或过滤ObjectStorage对象

时间:2016-10-29 14:29:51

标签: typo3 extbase typo3-6.2.x

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

我想在AppointmentController中做的是:

  1. 在第一个操作中:清空appointment的属性expertises(未将其设置为NULL,我只想要一个空的ObjectStorage,我可以添加一些内容稍后)
  2. 在第二个操作中:使用appointment(来自其他对象)填充expertises,其属性checked等于true
  3. 开始清空时,我查看了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仅用于包含在当前存储的另一个存储中的对象)并且没有过滤功能

2 个答案:

答案 0 :(得分:1)

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

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

关于过滤:正如您已经注意到的,您必须自己完成。我会在模型中实现像getActiveExpertises这样的函数,因为它比在控制器中更适合。

答案 1 :(得分:0)

ExtbaseObjects中指向ObjectStorage的设置器具有默认为null的可选参数。只需调用不带参数的设置器即可。您不必通过实例化一个空的StorageObject来浪费性能。

$appointment->setExpertises();