2013-03-02 109 views
1

在網絡上搜索了很長時間之後,我決定寫我的第一篇文章。 我希望我以正確的方式去做。Symfony ManyToMany雙向關係只能堅持一個方向

這是我的問題。 我在我的項目中使用了symfony 2.1。 我必須處理2個對象之間的雙向多對多關係。
我創建了2個實體,完成了映射,完成了控制器,模板和formBuilder。 我設法堅持這兩個實體。 對於一個實體,我可以堅持實體和與另一個的關係。 但對於另一個實體,我只能堅持實體。 與其他實體的關係不會持續。

這裏有2個實體的提取物:

class EntrainementCategorie{ 
{...} 

/** @ORM\ManyToMany(targetEntity="EntrainementType", mappedBy="categories", cascade="persist") */ 
protected $types; 

} 

這裏是第二個實體:

class EntrainementType{ 

{...} 

/** 
* @ORM\ManyToMany(targetEntity="EntrainementCategorie",inversedBy="types", cascade="persist") 
* @ORM\JoinTable(name="mottet_entrainement_types_categories", 
*     joinColumns={@ORM\JoinColumn(name="idType", referencedColumnName="id")}, 
*     inverseJoinColumns={@ORM\JoinColumn(name="idCategorie", referencedColumnName="id")}) 
*/ 
protected $categories; 

} 

所以你可以看到,有類別之間的bidirectionnal許多一對多的關係類型。

這裏是控制器:

class EntrainementCategorieController extends GenericController{ 

{...} 

public function creerAction(Request $request){ 
    return $this->creerActionGeneric($request,new Categorie(),new CategorieType()); 
} 

} 

第二個:

class EntrainementTypeController extends GenericController{ 

{...} 

public function creerAction(Request $request){ 
    return $this->creerActionGeneric($request,new Type(),new TypeType()); 
} 

} 

這裏是GenericController:

class GenericController extends Controller{ 

{...} 

protected function creerActionGeneric(Request $request,$object,$objectType){ 
    $form = $this->createForm($objectType,$object); 
    $isThereProblem = false; 
    if ($request->isMethod('POST')) { 
     $isThereProblem = true; 
     $form->bind($request); 
     if ($form->isValid()) { 
      $this->getEntityManager()->persist($object); 
      $this->getEntityManager()->flush(); 
      $this->get('session')->getFlashBag()->add('information', $this->FORM_SUCCESS_MESSAGE); 
      $isThereProblem = false; 
     } 
    } 
    if ($isThereProblem){ 
     $this->get('session')->getFlashBag()->add('error', $this->FORM_ERROR_MESSAGE); 
    } 
    return $this->render($this->BUNDLE.':'.$this->ENTITY.':'.$this->CREATE_TEMPLATE, array('form' => $form->createView())); 
} 

} 

這裏是formBuilder:

class EntrainementCategorieType extends AbstractType{ 

{...} 

public function buildForm(FormBuilderInterface $builder, array $options){ 
    $builder->add('label','text') 
      ->add('types','entity',array(
            'class' => 'KarateEntrainementBundle:EntrainementType', 
            'property' => 'label', 
            'multiple' => true, 
            'expanded' => true)); 
} 

} 

,第二個:

class EntrainementTypeType extends AbstractType{ 

{...} 

public function buildForm(FormBuilderInterface $builder, array $options){ 
    $builder->add('label','text') 
      ->add('categories','entity',array(
              'class' => 'KarateEntrainementBundle:EntrainementCategorie', 
              'property' => 'label', 
              'multiple' => true, 
              'expanded' => true)); 
} 

} 

所以當我填寫表格EntrainementType,無論類型及其與類關係依然存在。 但是,當我fille EntrainementCategory形式,只有類別是持久的,而不是它與類型的關係。

有誰知道我做錯了什麼?

希望我已經明白了。 謝謝你的幫助!

+3

是否有可能將此縮減爲更小的示例?有很多的代碼要經過,並很可能把很多人失去應答。 – ChrisF 2013-03-02 12:23:49

+0

這是正確的。 這。 我認爲我刪除所有代碼,這不是解決這個問題 – emottet 2013-03-02 13:16:23

+0

對於多對多關係,應該有你的數據庫,一個實體與其他 – 2013-03-02 13:26:27

回答

1

我終於設法做到了。 我不能在那個上使用creerActionGeneric。 我必須設置明確的類別和各類型之間的關聯:

$form->bind($request); 
if ($form->isValid()) { 
    $this->getEntityManager()->persist($categorie); 
    foreach($categorie->getTypes() as $type){ 
     $type->addCategorie($categorie); 
     $this->getEntityManager()->persist($type); 
    } 
    $this->getEntityManager()->flush(); 
} 

,這是工作得很好。 但我不知道爲什麼當我堅持從Type的另一個方向,我不必這樣做? oO

0

有一個更好的方法可以通過關係的學說配置去做。 Doctrine將允許您指定引用關係的連接表和列。

其實我更決定讀進去,因爲這似乎並不合適......這是正道着手做這樣的關係(在YML,因爲這是之前在這個答案我迷迷糊糊喜歡),並與我的實體明顯(供稿可以有/屬於對許多列表和列表可以擁有/屬於對許多飼料)飼料

配置:

manyToMany: 
    providerLists: 
     targetEntity: ProviderList 
     joinTable: 
      name: providerlist_feed 
      joinColumns: 
       feed_id: 
        referencedColumnName: id 
      inverseJoinColumns: 
       providerlist_id: 
        referencedColumnName: id 

的配置列表

manyToMany: 
    feeds: 
     targetEntity: Feed 
     joinTable: 
      name: providerlist_feed 
      joinColumns: 
       providerlist_id: 
        referencedColumnName: id 
      inverseJoinColumns: 
       feed_id: 
        referencedColumnName: id 

因此,這兩個實體現在彼此擁有,並且兩者都將以相同方式持續:)