Forms 将具有额外字段的多对多关系呈现为一个窗体

Forms 将具有额外字段的多对多关系呈现为一个窗体,forms,symfony,doctrine-orm,Forms,Symfony,Doctrine Orm,我想知道在symfony2中创建一个表单来处理与额外字段的多对多关系的最佳方法是什么 例如,假设我想为用户创建一个通知功能。我有用户和通知实体。另外,为了能够在实体之间的多对多关系中添加额外的参数,我创建了第三个实体UserNotification。额外参数指示用户是否已读取通知 * @ORM\Entity() */ class Notification { /** @Id @Column(type="integer") */ private $id; /** @One

我想知道在symfony2中创建一个表单来处理与额外字段的多对多关系的最佳方法是什么

例如,假设我想为用户创建一个通知功能。我有
用户
通知
实体。另外,为了能够在实体之间的多对多关系中添加额外的参数,我创建了第三个实体
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 | 
+---------+-----------------+---------+
好的,现在问题是,如何制作一个表单,允许向一些用户发送通知?对于经典的多对多关系,这不是问题。我有一个
NotificationType
和下面的
builder

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

但是由于我必须创建中间的
UserNotification
实体,所以我不知道该怎么做。谢谢你的帮助;)

我也做了同样的事。我的
内部消息
实体是您的
通知
。在表单中,
users
字段未映射(
property\u path
false
),并使用订阅者对其进行验证:

公共函数buildForm(FormBuilder$builder,数组$options)
{
$builder
->添加('title','text',数组(
“标签”=>“标题*”
))
->添加('content','textarea',数组(
“标签”=>“内容*”
))
->添加('priority',new PriorityType(),数组(
“标签”=>“优先级*”
))
->添加('users','entity',数组(
“标签”=>“目的地*”,
'class'=>'Acme\HelloBundle\Entity\User',
'属性'=>'选择标签',
“多个”=>true,
“扩展”=>true,
“属性路径”=>false,
));
;
$builder->addEventSubscriber(新的AddUsersValidationSubscriber());
}
在我的控制器中,我唯一要做的事情(假设表单有效)是为表单模型中的每个用户创建一个
InternalMessageFeedback
实体(与您的
UserNotification
):

$message=newinternalmessage();
$form=$this->createForm(新的InternalMessageType(),$message);
// ...
//发送者
$message->setUser($this->getSecurityContext()->getToken()->getUser());
//坚持反方向
$em=$this->getEntityManager();
$em->persist($message);
//每个用户有一个反馈
/**@var$user\Acme\HelloBundle\Entity\user*/
foreach($form->get('users')->getData()作为$user){
$feedback=新的InternalMessageFeedback();
//查看当前反馈的消息和用户
$feedback->setInternalMessage($message);
$feedback->setUser($user);
//坚持己方
$em->persist($feedback);
//同步反面
$message->addInternalMessageFeedback($feedback);
}
$em->flush();

希望这有帮助:)

谢谢你的回答Gremo;)我不知道
属性\u路径
属性。它就像一个符咒。