1

在网上搜索了很长时间后,我决定自己写我的第一篇文章。我希望我以正确的方式去做。

这是我的问题。我在我的项目中使用 symfony 2.1。而且我必须处理两个对象之间的双向多对多关系。
我已经创建了 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;

}

所以你可以看到,类别和类型之间存在双向多对多关系。

这是控制器:

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 表单时,类型及其与类别的关系都将保持不变。但是当我填写 EntrainementCategory 表单时,只有类别被保留,而不是它与类型的关系。

有谁知道我做错了什么?

希望我已经很清楚了。谢谢你的帮助 !

4

2 回答 2

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

这工作得很好。但是我不知道为什么当我坚持类型时,我不必那样做???oO

于 2013-03-02T21:43:55.377 回答
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

因此,这两个实体现在都拥有彼此,并且两者都将以相同的方式存在:)

于 2014-12-12T02:57:24.000 回答