1

長い間ウェブで検索した後、私は自分の最初の投稿を書くことにしました。私はそれを正しい方法で行うことを願っています。

これが私の問題です。私は自分のプロジェクトでsymfony2.1を使用しています。そして、2つのオブジェクト間の双方向の多対多の関係に対処する必要があります。
2つのエンティティを作成し、マッピングを行い、コントローラー、テンプレート、およびformBuilderを実行しました。私はなんとか両方のエンティティを永続化することができます。1つのエンティティについて、エンティティと他のエンティティとの関係を永続化できます。しかし、他のエンティティの場合、私はエンティティを永続化することしかできませんでした。他のエンティティとの関係は持続しません。

2つのエンティティの抜粋は次のとおりです。

class EntrainementCategorie{
{...}

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

}

これが2番目のエンティティです:

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

}

2つ目:

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

}

そして2番目のもの:

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

私はついにそれを行うことができます。その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 に答える