Symfony2:如何在三个实体一对一关系场景中合并表单

时间:2014-11-06 08:58:14

标签: forms symfony

情景:

客户表:id(PK),customer_name,地址

Customer_detail表:id(PK),customer_id(FK),电话,电子邮件

信用表:id(PK),customer_id(FK),credit_code,description

客户详细信息中存在单向一对一关系,客户表中存在信用关系。

我为两者创建了实体类和表单类型。我可以插入单独的表格。

我希望显示这样的表单,输入的值应该插入到相应的表中。

客户名称:___________________

地址:________________________

电话:__________________________

电子邮件:__________________________

信用代码:____________________

信用说明:_____________

我发现我必须写$ builder-> add(' customer',new CustomerType());这个代码以客户详细信息的形式出现在我的客户表单中。但是,在三个实体的情况下,我如何合并表格?

信用表与客户明细表无关?

表格图:

http://i.stack.imgur.com/NXioQ.png

1 个答案:

答案 0 :(得分:1)

我在这里看不到任何问题, 1.创建一个CustomerType表单:

...
$builder->add('customer_name')->add('address', 'textarea');
...

'data_class' => 'Vendor\Bundle\Entity\Customer'

2。创建CustomerDetailType:

...
$builder->add('customer', new CustomerType())->add('phone')->add('email', 'email');
...

'data_class' => 'Vendor\Bundle\Entity\CustomerDetail'

3。创建一个MyFormType:

...
$builder->add('customer_details', new CustomerDetailType()/* this field requires 'mapped' => false option and it will be handled manually */)->add('credit_code')->add('description', 'textarea');
...

'data_class' => 'Vendor\Bundle\Entity\Credit'

另外,您应该查看Doctrine的cascade选项..

PS // 在这种情况下,我通常会这样:客户与CustomerDetails有关系,CustomerDetails与Credit有关系:

Customer:
  - field: customerDetails

CustomerDetails:
  - field: credit

之后嵌入的表单将如下所示:

信用:

...
$builder->add('credit_code')->add('description', 'textarea');
...

'data_class' => 'Vendor\Bundle\Entity\Credit'

为CustomerDetails:

...
$builder->add('phone')->add('email', 'email')->add('credit', new CreditType());
...

'data_class' => 'Vendor\Bundle\Entity\CustomerDetail'

CustomerType:

...
$builder->add('customer_name')->add('address', 'textarea')->add('customerDetail', new CustomerDetailType());
...

'data_class' => 'Vendor\Bundle\Entity\Customer'

使用cascade persist选项FormComponent和Doctrine自动保存实体..