没有集合的两个实体

Two entities without collections

我有以下问题。名称为 "user" 的实体与实体 "address" 存在多对多关系。我想创建一个表单 "UserType"。在这种形式中,我将准确显示地址实体。一个地址用于私人地址信息,一个地址用于商业地址信息。

我通过集合实现了这一点,我可以添加和删除许多地址集合。

http://symfony.com/doc/current/cookbook/form/form_collections.html

但是我如何在创建或编辑没有集合的用户时准确显示两个地址实体?

有几种方法。一种是向用户实体添加 get/set privateAddress 和 businessAddress 方法,然后确保初始化集合。类似于:

$user = new User();
$user->addAddress(new Address('Private'));
$user->addAddress(new Address('Business'));

$builder = $this->createFormBuilder($user);
$builder
    ->add('privateAddress',  new AddressFormType())
    ->add('businessAddress', new AddressFormType())
;

在创建具有多个子项的对象时,我经常使用第二种方法。在这种方法中,您将多个独立的对象放入一个数组中,然后在发布表单后将它们拼接在一起。

$data = array(
    'user' => new User(),
    'privateAddress'  => new Address('Private'),
    'businessAddress' => new Address('Business'),
);
$builder = $this->createFormBuilder($data);
$builder
    ->add('user', new UserFormType())
    ->add('privateAddress',  new AddressFormType())
    ->add('businessAddress', new AddressFormType())
;
...
if ($form->isValid())
    // Stitch your object together then persist

两种方法都有效。第二个更灵活一点,避免了向用户对象添加额外方法的需要。当然,您可能仍然需要这些方法。