3

是否可以从 2 个连接的实体对象构建表单?

我有两个实体property&propertylanguage加入了 onetomany 关系。(一个属性可以有多种语言)

语言有 atitledescription分栏。因此,一处房产可以有英文、法文、德文标题。

我正在尝试建立一个表格。见下文。

控制器: addProperty.php

class AddPropertyController extends Controller
{
    // ....

    public function indexAction(Request $request)
    {
        $property = new  property;
        $language = new  propertyLanguage;
        $property ->addpropertylanguage($language);

        $form = $this->createForm(new propertyType($this->getDoctrine()),$property);

       // ..... 

    }

表单类型:propertType.php

public function buildForm(FormBuilder $builder, array $options)
    {

        $builder
            ->add('title', 'text');
           // other ->add() below.

    }

它返回以下错误:

类“\defaultBundle\Entity\property”中不存在属性“title”、方法“getTitle()”和方法“isTitle()”

当然属性中没有属性Title,但是propertylanguage中有一个。即使我尝试: ->add('title', 'entity', array('class'=>defaultBundle:propertylanguage)); 它不起作用。

谢谢你有时间帮助我。

最好的,

皮埃尔。

4

2 回答 2

1

您要做的是创建一个 PropertyLanguageType 类以及一个 PropertyType。

然后,在您的 PropertyType 中,您将嵌入 PropertyLanguageType:

public function buildForm(FormBuilder $builder, array $options)
{

    // $builder->add('propertyLanguage', new PropertyLanguageType());

    // Since we have a 1 to many relation, then a collection is needed
    $builder->add('propertyLanguage', 'collection', array('type' => new PropertyLanguageType()));

PropertyLanguageType 是您添加标题的位置。

这一切都在手册的表格部分中,但可能需要多次阅读。

第二种方法是向您的 Property 实体添加一个 getTitle,它将从 PropertyLanguage 实体返回标题。通过这样做,您的原始表单将起作用。但是当您开始与多个属性建立多个关联时,它可能会有点混乱。最好只为每个实体定义一个类型。

于 2012-06-08T11:35:05.070 回答
0

您可以在定义表单时使用 query_builder。这是您的表单类的外观。当然,它肯定不会完全如此,但这会给你一个好的开始;)

public function __construct($id)
{
    $this->propertylanguageId = $id;
}   

public function buildForm(FormBuilder $builder, array $options)
{
    $builder->add('propertylanguage', 'entity', array(
                    'label' => 'Property Language',
                    'class' => 'YourAdressToBundle:Propertylanguage',
                    'query_builder' => function(EntityRepository $er) use ($propertylanguageId) {
                                            return $er->createQueryBuilder('p')
                                            ->join('p.property', 'prop', Expr\Join::WITH, 'prop.id = :propertylanguageId')
                                            ->setParameter('propertylanguageId', $propertylanguageId);
                                       },
                ));
}

希望这会有所帮助

于 2012-06-08T09:35:40.323 回答