出于某种原因,我需要分离一些数据,现在我有三个实体:
现在Order有一些基本数据,比如deliveryPlace等......并且与OrderingCompany和FinalUser处于一对一的关系。
现在,在一种形式中,我想让用户指定一些订单数据,还有关于订购公司和最终用户的所有信息。如何将OrderingCompany和FinalUser嵌入到许多字段中,因为据我所知,实体类型只允许选择一个字段。
我正在考虑手动处理表单,但处理handleRequest将是一个完全地狱。
那我该怎么做呢?
答案 0 :(得分:3)
您应该使用两个(复合)字段构建Order表单:OrderingCompany和FinalUser。 这两个字段都可以用自己的类型表示(但不是强制性的)。
在下面的示例中,我将快速而又脏,我将手动构建表单。
没有什么禁止你将字段的构造提取到单独的类型。
<?php
class Order extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('orderdata') // orderdata should exist on order entity
->add('finalUser', new FinalUserType)
// same with OrderingCompany
;
}
public function getName()
{
return 'order';
}
}
class FinalUserType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name');
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array('data_class' => 'FinalUser'));
}
}
还有另一种可能性:使用属性路径将表单字段直接映射到实体图的基础对象(假设您的图形具有正确的实例):
<?php
class Order extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('orderdata') // orderdata should exist on order entity
->add('finalUserName', 'text', array(
'property_path' => 'finalUser.name' // $order->getFinalUser()->(get|set)Name() will be called
))
;
}
}