在Symfony2中编辑多对多关系

时间:2011-12-23 15:06:49

标签: forms symfony doctrine-orm

我正在使用带有Doctrine的Symfony2,并希望编辑用中间表表示的两个表之间的关系。结构是这样的:

存储在表格中的实体游览

存储在表格标签中的实体标签

我有一个中间表tour_tags来存储每行的两个索引:tour_id,tag_id。

实体定义如下:

/**
 * @ORM\Table(name="tour")
 * @ORM\Entity
 */
Tour {
  /**
   * @ORM\ManyToMany(targetEntity="Tag")
   * @ORM\JoinTable(name="tour_tags",
   *     joinColumns={@ORM\JoinColumn(name="tour_id", referencedColumnName="id")},
   *     inverseJoinColumns={@ORM\JoinColumn(name="tag_id", referencedColumnName="id")}
   *     )
   */
  private $tags;

  ...
}

/**
 * @ORM\Table(name="tags")
 * @ORM\Entity
 */
class Tag {
  ...
}

正如您所看到的,我没有在Tag实体中添加任何关系信息。 这种模式可以很好地获取相关数据,每个游览的标签等等。

但我希望用户能够通过Tour表单中的复选框编辑关系信息。我想要包含一组复选框,一个用于表格中的现有标签。 使用此文档http://symfony.com/doc/current/cookbook/form/form_collections.html,可以从巡视表单中编辑标记名称:

/* The tour form */
Class TourType {
  public function buildForm(FormBuilder $builder, array $options) {
    ...
    $builder->add('tags', 'collection', array('type' => new TourTagsType()));
  }
}

但不创建或删除关系(table tour_tags)。

我正在寻找一种在表单中嵌入关系(tour_tag)的方法,这样如果表格中有一个tour_id,tag_id行,则会显示复选框。

1 个答案:

答案 0 :(得分:0)

在Tour类中,添加以下构造函数:

public function __construct() {
  $this->tags = new \Doctrine\Common\Collections\ArrayCollection();
}

在你的TourType中:

$builder->add('tags', 'entity',  array(
                'class' => 'YourBundle:Tag',
                'expanded' => true,
                'multiple'  => true
            ))