2017-04-26 53 views
1

我使用EntityType創建表單,但未映射到實體上。表單很長,用戶多次重複使用相同的選項,然後當他對錶單有效時,如果有效,我會將$form->getData()存儲在會話中。非映射表單,實體類型和數據屬性

當我生成表單時,我注入了$data。它非常適用所有選項,除了EntityType,我不明白爲什麼...

$data,我已經在EntityType選擇的對象的ArrayCollection,但形式不選擇它。我用mapped = false,因爲如果我刪除它,我已經一個錯誤:

Entities passed to the choice field must be managed. Maybe persist them in the entity manager?

有人我有一個想法,怎麼辦?

回答

4

設置mapped = false不應該是這種情況下的解決方案,因爲您需要將存儲的數據寫入此字段中,對不對?所以mapped = false避免它(見更多關於mapped選項here

這裏的問題是,EntityType需要從每個項目得到id值,並要求這些項目EntityManager實際管理:

Entities passed to the choice field must be managed. Maybe persist them in the entity manager?

實體處於MANAGED狀態,其持久性由EntityManager管理。換句話說,如果一個實體從數據庫中提取或者通過EntityManager#persist註冊爲新的實體,它將被管理。

在你的情況下,這些實體來自會話,所以你有兩個選擇:

  • 重新查詢從數據庫中存儲的實體:

    if (isset($data['foo']) && $data['foo'] instanceof Collection) { 
        $data['foo'] = $this->getDoctrine()->getRepository(Foo::class)->findBy([ 
         'id' => $data['foo']->toArray(), 
        ]); 
    } 
    
  • 或者設置自定義choice_value選項以避開默認值:

    $form->add('foo', EntityType::class, [ 
        'class' => Foo::class, 
        'choice_value' => 'id', // <--- default IdReader::getIdValue() 
    ]); 
    
+1

非常感謝,我嘗試了第二種方法,因爲使用更方便。它的工作原理,並感謝解釋。 – mpiot

相關問題