Symfony2 + Doctrine2 /从2个连接的实体对象构建表单

时间:2012-06-08 07:19:10

标签: symfony doctrine-orm

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

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

语言有titledescription个colomns。 所以一个房产可以有英文,法文,德文标题。

我正在尝试构建一个表单。 见下文。

控制器: 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.

    }

它返回以下错误:

  

既不是属性“title”也不是方法“getTitle()”也不是方法   “isTitle()”存在于类“\ defaultBundle \ Entity \ property”

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

谢谢,如果你有时间帮助我。

最佳,

皮尔。

2 个答案:

答案 0 :(得分: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是您添加标题的位置。

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

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

答案 1 :(得分: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);
                                       },
                ));
}

希望这会有所帮助