2012-06-08 76 views
3

是否可以從2個連接的實體對象創建表單?Symfony2 + Doctrine2 /從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. 

    } 

它返回下列錯誤:

Neither property "title" nor method "getTitle()" nor method "isTitle()" exists in class "\defaultBundle\Entity\property"

當然有沒有適當的ty屬性中的標題,但屬性語言中有一個。 即使我嘗試: - > add('title','entity',array('class'=> defaultBundle:propertylanguage)); 它不起作用。

謝謝,如果你有時間來幫助我。

最好,

皮埃爾。

回答

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); 
             }, 
       )); 
} 

希望那將是有益的

+0

嗨,感謝您的時間和幫助。 其實我更喜歡避免queryBuilder,因爲如果我想從實體對象構建表單,我認爲它不起作用。例如:$ form = $ this-> createForm(new propertyType($ this-> getDoctrine()),$ property); 我會去wz Cerad答案看起來更好的做法。 再次感謝您的時間 – 123pierre

+0

嗨,我自己曾經爲一個項目使用過它,但它確實有效,但Cerad解決方案當然也可以運行!快樂編碼;) – SebScoFr

1

你會想要做的是使一個PropertyLanguageType類以及作爲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實體返回標題。通過這樣做,你的原始形式將起作用。但是當你開始與多個屬性進行多重關聯時,它可能會有點混亂。最好只爲每個實體定義一個類型。

+0

嗨Cerad,非常感謝,你給我我需要的東西。它工作完美! 我還沒有達到15個聲望,所以我不能爲您的迴應投票。 非常感謝。 – 123pierre

+1

感謝雖然你應該能夠接受答案?無論如何,我很高興能夠提供幫助。 – Cerad

相關問題