2012-11-17 27 views
9

şeklinde oluşturulmalıdır Symfony2'de ek alanla çoktan çoğa ilişkisi olan bir form oluşturmanın en iyi yolunun ne olduğunu merak ediyorum2.Ek alanlar ile çoktan çoğa ilişkisi

Örnek için, kullanıcılar için bir bildirim özelliği oluşturmak istediğimi varsayalım. User ve Notification varlıkları var. Ayrıca, varlıklar arasındaki çoktan çoğa ilişkide ek parametreler ekleyebilmek için, üçüncü bir varlık olan UserNotification'u yarattım. Ekstra parametre, bildirimin kullanıcılar tarafından okunup okunmadığını gösterir. Burada şimdi

 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 | 
+---------+-----------------+---------+ 

Tamam bu tür verileri almak mümkün

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

    ... 
} 

Bu şekilde nasıl bazı kullanıcılara bir bildirim göndermesine izin bir form yapmak sorunu vardır? Klasik bir çoktan-çoğa ilişkisi ile bir sorun değildi. Ben şu builder ile NotificationType vardı:

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

Ama ara UserNotification varlık yaratmak zorundaydı çünkü ben bunu nasıl hiçbir fikrim yok. Yardımınız için teşekkür ederiz;)

cevap

4

Ben de aynısını yaptım. Benim InternalMessage varlığınız Notification. formda, users alan eşlenmedi (property_pathfalse olan) ve bir aboneyi kullanılarak doğrulanır oluyor:

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

benim denetleyicisi, tek şey ben yapmak zorunda (bunu engellemek formu varsayarak geçerlidir) 'dir

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

Umut bu yardımcı olur :) y

+0

Teşekkür: bir InternalMessageFeedback varlık formu modelinde her kullanıcı ön (sizin UserNotification aynı) oluşturmak için cevabımız Gremo;) 'property_path' özelliği hakkında farkında değildim. Ve bir çekicilik gibi çalışıyor. –

İlgili konular