2012-11-17 8 views
9

Ich frage mich, was ist der beste Weg, um ein Formular erstellen, die eine Viele-zu-viele-Beziehung mit zusätzlichen Feld in Symfony2 behandeln.Rendern einer Viele-zu-Viele-Beziehung mit zusätzlichen Feldern in ein Formular

Für das Beispiel sagen wir, ich möchte eine Benachrichtigungsfunktion für Benutzer erstellen. Ich habe die User und die Notification Entitäten. Um zusätzliche Parameter in der Viele-zu-Viele-Beziehung zwischen Entitäten hinzufügen zu können, habe ich eine dritte Entität UserNotification erstellt. Der zusätzliche Parameter zeigt an, ob die Benachrichtigung von den Benutzern gelesen wurde oder nicht.

* @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; 

    ... 
} 

So kann ich bin in der Lage, diese Art von Daten jetzt

 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 hier zu bekommen, ist das Problem, wie ein Formular zu machen, die eine Benachrichtigung für einige Benutzer senden lassen? Mit einer klassischen Viele-zu-Viele-Beziehung war das kein Problem. Ich hatte ein NotificationType mit folgenden builder:

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

Aber da ich die Zwischen UserNotification Einheit zu schaffen hatte, ich habe keine Ahnung, wie es zu tun. Danke für deine Hilfe;)

Antwort

4

Ich habe genau das selbe gemacht. Meine InternalMessage Einheit ist Ihre Notification. In der Form wird users Feld nicht zugeordnet (property_path ist false) und es ist mit einem Teilnehmer bestätigt:

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

Während in meinem Controller, das einzige, was ich zu tun habe (diese Form der Annahme gültig ist) ist

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

this helps :)

+0

Vielen Dank für y: eine InternalMessageFeedback Entität (das gleiche wie Ihr UserNotification) Vordergrund jeden Benutzer in Form Modell zu erstellen unsere Antwort Gremo;) Ich war mir der Eigenschaft 'property_path' nicht bewusst. Und es funktioniert wie ein Zauber. –

Verwandte Themen