我目前在我的应用程序中有实体:
一个页面可以有很多块,这些块在很多页面之间共享,因此很明显这个关系是ManyToMany。但是,我需要能够将同一个块添加两次(或更多)到同一个页面。 Doctrine创建" page_block"自动连接表,但是将page_id和block_id都作为主键,因此添加副本会引发错误。
是否有可能在不添加额外实体的情况下告诉学说允许在页面 - 块关系上重复使用?
答案 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注释的方法,但这种方法没有区别。
希望这对你有所帮助。