I’m wondering what is the best way to create a form that handle a many-to-many relation with extra field in symfony2.
For the example let’s say I would like to create a notifying feature for users. I have the User and the Notification entities. Also in order to be able to add extra parameters in the many-to-many relation between entities, I created a third entity UserNotification. The extra parameter indicates if the notification has been read or not by the users.
* @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;
...
}
This way I am able to get this kind of data
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 now here is the problem, how to make a form which allow to send a notification to some users? With a classic many-to-many relation it was not a problem. I had a NotificationType with the following builder:
$builder->add('users', 'entity', array(
'class' => 'User',
'property' => 'name',
'multiple' => 'true',
))
->add('message', 'text');
But since I had to create the intermediate UserNotification entity, I have no idea how to do it. Thanks for your help 😉
I did exactly the same. My
InternalMessageentity is yourNotification. In the form,usersfield is not mapped (property_pathisfalse) and it’s validated using a subscriber:While in my controller, the only thing i have to do (assuming that form is valid) is to create one
InternalMessageFeedbackentity (the same as yourUserNotification) fore each user in form model:Hope this helps 🙂