2012-11-17 8 views
9

symfony2の余分なフィールドと多対多の関係を処理するフォームを作成するにはどうすればよいでしょうか。余分なフィールドを持つ多対多の関係をフォームにレンダリングする

たとえば、ユーザーに通知機能を作成したいとします。私はUserNotificationエンティティを持っています。エンティティ間の多対多の関係で余分なパラメータを追加できるようにするために、私は第3のエンティティUserNotificationを作成しました。余分なパラメータは、通知がユーザによって読み取られたかどうかを示します。

* @ORM\Entity() */ 
class Notification 
{ 
    /** @Id @Column(type="integer") */ 
    private $id; 

    /** @OneToMany(targetEntity="UserNotification", mappedBy="notification") */ 
    private $usernotifications; 

    /** @Column() */ 
    private $message; 

    ... 
} 

* @ORM\Entity() */ 
class User 
{ 
    /** @Id @Column(type="integer") */ 
    private $id; 

    /** @OneToMany(targetEntity="UserNotification", mappedBy="user") */ 
    private $usernotifications; 

    /** @Column() */ 
    private $name; 

    ... 
} 

* @ORM\Entity() */ 
class UserNotification 
{ 
    /** @ManyToOne(targetEntity="User", inversedBy="usernotifications") 
    private $user; 

    /** @ManyToOne(targetEntity="Message", inversedBy="usernotifications") 
    private $message; 

    /** @Column(type="boolean") */ 
    private $isRead; 

    ... 
} 

私は今ここでこの種のデータ

 User 
+----+---------+ 
| id | name | 
+----+---------+ 
| 1 | John | 
| 2 | Paul | 
+----+---------+ 

     Notification 
+----+----------------------+ 
| id | message    | 
+----+----------------------+ 
| 1 | Cool stuff   | 
| 2 | Lorem ipsum   | 
+----+----------------------+ 

     UserNotification 
+---------+-----------------+---------+ 
| user_id | notification_id | isRead | 
+---------+-----------------+---------+ 
| 1  |    1 |  1 | 
| 2  |    1 |  0 | 
| 1  |    2 |  0 | 
| 2  |    2 |  1 | 
+---------+-----------------+---------+ 

[OK]を取得することができています。この方法では、一部のユーザーに通知を送信できるようにフォームを作成する方法、問題ありますか?古典的な多対多の関係では、それは問題ではありませんでした。私は、次のbuilderNotificationTypeを持っていた:

$builder->add('users', 'entity', array(
       'class' => 'User', 
       'property' => 'name', 
       'multiple' => 'true', 
      )) 
      ->add('message', 'text'); 

しかし、私は中間UserNotificationエンティティを作成しなければならなかったため、私はそれを行うにはどのようには考えています。あなたの助けをありがとう;)

答えて

4

私はまったく同じでした。私のInternalMessageエンティティはNotificationです。フォームでは、usersフィールドがマップされていない(property_pathfalseである)、それは、加入者を使用して検証です:

public function buildForm(FormBuilder $builder, array $options) 
{ 
    $builder 
     ->add('title', 'text', array(
      'label' => 'Titolo *' 
     )) 
     ->add('content', 'textarea', array(
      'label' => 'Contenuto *' 
     )) 
     ->add('priority', new PriorityType(), array(
      'label' => 'Priorità *' 
     )) 
     ->add('users', 'entity', array(
      'label'   => 'Destinatari *', 
      'class'   => 'Acme\HelloBundle\Entity\User', 
      'property'  => 'select_label', 
      'multiple'  => true, 
      'expanded'  => true, 
      'property_path' => false, 
     )); 
    ; 

    $builder->addEventSubscriber(new AddUsersValidationSubscriber()); 
} 

私のコントローラでは、(フォームが有効であると仮定して)私がしなければならない唯一の事ではあるが

$message = new InternalMessage(); 
$form = $this->createForm(new InternalMessageType(), $message); 

// ... 

// The sender 
$message->setUser($this->getSecurityContext()->getToken()->getUser()); 

// Persist the inverse side 
$em = $this->getEntityManager(); 
$em->persist($message); 

// One feedback for each user 
/** @var $user \Acme\HelloBundle\Entity\User */ 
foreach($form->get('users')->getData() as $user) { 
    $feedback = new InternalMessageFeedback(); 

    // Se the message and user for current feedback 
    $feedback->setInternalMessage($message); 
    $feedback->setUser($user); 

    // Persist the owning side 
    $em->persist($feedback); 

    // Sync the inverse side 
    $message->addInternalMessageFeedback($feedback); 
} 

$em->flush(); 

ホープ、このことができます:) yの

+0

感謝を:1つのInternalMessageFeedbackエンティティフォームモデル内の各ユーザーフォア(あなたUserNotificationと同じ)を作成します私たちの答えはGremo;)私は 'property_path'プロパティを知らなかった。そして、それは魅力のように働いています。 –

関連する問題