在数据库模型上,我在contact和contactAddress之间有一对多的关系。
我在ContactType中创建了2个不同的表单,我添加了子表单
$builder->add(
'contactAddress',
new ContactAddressType()
);
联系人实体类本身就有这个,但是这个实体在另一个包中,我无法改变它。
private $contactAddresses;
public function addContactAddress(ContactAddress $contactAddresses)
{
$this->contactAddresses[] = $contactAddresses;
return $this;
}
public function removeContactAddress($contactAddresses)
{
$this->contactAddresses->removeElement($contactAddresses);
}
public function getContactAddresses()
{
return $this->contactAddresses;
}
表单已正确呈现,但是当我提交表单时,我收到以下错误
Neither the property "contactAddress" nor one of the methods
"getContactAddress()", "contactAddress()", "isContactAddress()",
"hasContactAddress()", "__get()" exist and have public access in class
"App\Bundle\ContactBundle\Entity\Contact".
当我将字段更改为contactAddresses
时,会出现以下错误:
Neither the property "contactAddresses" nor one of the methods
"addContactAddress()"/"removeContactAddress()",
"setContactAddresses()", "contactAddresses()", "__set()" or "__call()"
exist and have public access in class
"App\Bundle\ContactBundle\Entity\Contact".
我如何使用property_path
之类的内容来说明如何设置属性,因为它似乎使用了setContactAddresses
并不存在?
答案 0 :(得分:0)
我不知道这是否会导致问题中描述的错误,但您无法将集合属性映射到单个表单类型。在这种情况下,联系人有很多$contactAddresses
,因此$contactAddresses
是一个集合。这意味着要在ContactType中表示$contactAddresses
,您需要添加collection field。例如:
$builder->add('contactAddresses', 'collection', array(
'type' => new ContactAddressType(),
'options' => array(
...
),
));
使用这样的表单,您可以更新现有地址,但添加和删除您需要添加一些客户端javascript的地址。通过收集字段,symfony可以提供一些帮助。在Collection field type - Adding and removing items的Symfony文档中有关于此的一些信息。但是,对于实体集合,您可能需要查看Cookbook条目How to embed a collection of forms。
答案 1 :(得分:0)
我认为你应该在主表单中嵌入一个表单集合。