symfony2 - 包含重复行的ManyToMany

时间:2016-08-03 08:22:58

标签: php symfony doctrine-orm many-to-many

我目前在我的应用程序中有实体:

一个页面可以有很多块,这些块在很多页面之间共享,因此很明显这个关系是ManyToMany。但是,我需要能够将同一个块添加两次(或更多)到同一个页面。 Doctrine创建" page_block"自动连接表,但是将page_id和block_id都作为主键,因此添加副本会引发错误。

是否有可能在不添加额外实体的情况下告诉学说允许在页面 - 块关系上重复使用?

1 个答案:

答案 0 :(得分:1)

好吧,我对这个学说中的行为并不确定,但如果是这样,那么你可以做一些我几乎总是这样做的事情。将ManyToMany关系表示为两个OneToMany-ManyToOne。您必须创建自己的PageBlock实体并配置它的外键。

class Page{
    /**
     * @var array
     *
     * @ORM\OneToMany(targetEntity="PageBlock", mappedBy="page", cascade={"all"})
     */
    private $pageBlocks;
}

class Block{
        /**
         * @var array
         *
         * @ORM\OneToMany(targetEntity="PageBlock", mappedBy="block", cascade={"all"})
         */
        private $pageBlocks;
    }

class PageBlock{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var \stdClass
     *
     * @ORM\ManyToOne(targetEntity="Page", inversedBy="pageBlocks")
     * @ORM\JoinColumn(name="id_page", referencedColumnName="id")
     */
    private $page;

    /**
     * @var \stdClass
     *
     * @ORM\ManyToOne(targetEntity="Block", inversedBy="pageBlocks")
     * @ORM\JoinColumn(name="id_block", referencedColumnName="id")
     */
    private $block;
  }

如您所见,主键仍为ID,因此问题已解决。我说几乎总是这样做,因为如果我需要关系中的额外属性(几乎总是它发生),这就是我的方式。我怀疑这可能是使用ManyToMany注释的方法,但这种方法没有区别。

希望这对你有所帮助。