我有两个具有多对多关系的模型。ID不由条令管理,而是由不同应用程序的GUID生成器管理。所以我的实体有一个名为uniqueIdentifier
而不是id
的字段。这么做:
class Bar {
/**
* @ManyToMany(targetEntity="Foo", mappedBy="bar")
*/
private $foo;
}
class Foo {
/**
* @ManyToMany(targetEntity="Bar", mappedBy="foo")
*/
private $bar;
}
我收到一个错误,说明Column name 'id' referenced for relation from AppEntityFoo towards AppEntityBar does not exist
。我知道这是由于原则默认情况,即将内容映射到引用列名的_id
和联接表的table1_table2
。
我不能覆盖默认值,因为一些模型确实有自动生成的值,并且依赖于id
字段。相反,我想做以下事情:
class Bar {
/**
* @ManyToMany(targetEntity="Foo", mappedBy="bar")
* @JoinColumn(name="foo_uid", referencedColumnName="uniqueIdentifier")
*/
private $foo;
}
class Foo {
/**
* @ManyToMany(targetEntity="Bar", mappedBy="foo")
* @JoinColumn(name="bar_uid", referencedColumnName="uniqueIdentifier")
*/
private $bar;
}
这不起作用,我得到了同样的错误。怎么办?
您的关联映射应该是这样的:
class Bar
{
/**
* @var Foo[]|DoctrineCommonCollectionsCollection
*
* @ORMManyToMany(targetEntity="Foo", inversedBy="bar")
* @ORMJoinTable(
* name="table1_table2",
* joinColumns={
* @ORMJoinColumn(name="foo_uid", referencedColumnName="uniqueIdentifier")
* },
* inverseJoinColumns={
* @ORMJoinColumn(name="bar_uid", referencedColumnName="uniqueIdentifier")
* }
* )
*/
private $foo;
}
class Foo {
/**
* @var Bar[]|DoctrineCommonCollectionsCollection
*
* @ORMManyToMany(targetEntity="Bar", mappedBy="foo")
*/
private $bar;
}
请记住,foo_uid
和bar_uid
列将在table1_table2
表中,而uniqueIdentifier
是Foo和Bar表上的标识符。