【问题标题】:symfony2 - ManyToMany with duplicate rowssymfony2 - 具有重复行的多对多
【发布时间】:2016-08-03 08:22:57
【问题描述】:

我目前必须在我的应用程序中使用实体:

  • 页面
  • 阻止

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

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

【问题讨论】:

  • @BenHillier 不是重复的,即使它是完全相同的东西。问题是我想允许尽可能多的重复,因此可以将完全相同的块添加到同一个页面 X 次。

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


【解决方案1】:

嗯,我不确定教义上的这种行为,但如果是这样的话,那么你可以做一些我几乎总是做的事情。将多对多关系表示为两个 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 注释的一种方法,但这种方法没有区别。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-18
    • 2012-08-13
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多