2012-03-04 4 views
6

ChannelEntity - > MatchChannelEntity < - MatchEntity MatchChannelEntityは、他の2つのテーブル間の多対多リレーションシップを保存します。チェックボックスをオンにして、チャンネルに一致するチャンネルが1つある場合は、そのチャンネルのチェックボックスが選択されています。どうすればいいですか?ここSymfony2で多対多フォームを設定する方法

は、フォームタイプコードである:

class MatchhType extends AbstractType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder 
      ->add('channels', 'entity', array('label' => 'Channels', 
              'class'   => 'Mikay\MikiBundle\Entity\Channel', 
              'multiple'  => true, 
              'expanded'  => true, 
              'query_builder' => function ($repository) 
              { 
              return $repository->createQueryBuilder('c')->orderBy('c.name', 'ASC'); 
              },)) 

MatchChannelタイプ:

class MatchChannel 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var integer $match_id 
    * @ORM\ManyToOne(targetEntity="Matchh", inversedBy="channels") 
    * @ORM\JoinColumn(name="match_id", referencedColumnName="id", nullable="true") 
    */ 
    private $match; 

    /** 
    * @var integer $channel_id 
    * 
    * @ORM\ManyToOne(targetEntity="Channel", inversedBy="mathces") 
    * @ORM\JoinColumn(name="channel_id", referencedColumnName="id", nullable="true") 
    */ 
    private $channel; 

私は説明する実施例を使用する、たとえば、私は三つのチャネルを有する:チャンネルA、チャンネルBおよびチャンネルCと1つの一致:一致M、一致Mは1つのチャンネルAを持ち、この関係はmatch_channelテーブルに保存されます。一致フォームがすべてのチャンネルを表示するようにし、チャンネルAが一致M 、その他は未チェックのままです

+0

エンティティフィールドタイプが必要です:http://symfony.com/doc/current/reference/forms/types/entity.html – Nanocom

+0

私はエンティティフィールドタイプを使用していますが、私の状況ははるかに複雑で、私が望むのはチャンネルテーブルのすべてのチャンネルをリストし、match_channelテーブルに保存されているものをチェックしてマッチが所有していることです。 – imikay

+0

フィールドタイプ定義内のチャネルテーブルからチャネルを取得し、自分のリンクを確認することができます。とにかく、詳細な回答が必要な場合は、いくつかのコードを表示し、問題の詳細を説明する必要があります。 – Nanocom

答えて

6

[OK]をクリックします。これは2つのテーブルの間に多かれ少なかれ多くの関係を設定し、正しい方法は次のようなものです(コードを少しトリムしました)。

多対多:1つのマッチには多数のチャンネルがあり、一致します。

マッチ:

class Match 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="Channel", inversedBy="matches") 
    * @ORM\JoinTable(name="match_channels") 
    */ 
    private $channels; 

チャンネル:

class Channel 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="Match", mappedBy="channels") 
    */ 
    private $matches;  

Doctrineは自動的にMatchChannelsという名前の、あなたのための相互参照表を作成します。 JoinTable注釈に注意してください、それは非常に重要です。

これを実行すると、他の種類のフォームやフィールドを作成するのと同じように、多対多のフォームを簡単に作成できます。

+0

私はついにこれを回避する方法を見つけました。あなたは、ソースコードhttp://www.prowebdev.us/2012/07/symfnoy2-many-to-many-relation-with.htmlを見ることができます – PMoubed

関連する問題