这种OneToOne关系可能与Doctrine(在Symfony中)吗?
User Time
+----------+ +-------+
| ... | | ... |
| time_id |o-----+-----o| user |
| | | | ... |
| time2_id |o-----+ | type |
| ... | +-------+
+----------+
也就是说,一个用户可能有两个不同的时间实体关联到它:一个类型=0,另一个类型=1。
我可以把时间分成两个不同的实体,但我认为这样我可以省去复制一些代码,因为时间实体有一个eventListener和更多相关的代码…
我这样编码:
class Time
{
...
/**
* @ORMOneToOne(targetEntity=User::class, mappedBy="time, cascade={"persist"})
* @ORMOneToOne(targetEntity=User::class, mappedBy="time2", cascade={"persist"})
*/
private $user;
...}
class User
{
...
/**
* @ORMOneToOne(targetEntity=Time::class, inversedBy="user", cascade={"persist"})
* @ORMJoinColumn(name="time_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
*/
private $time;
/**
* @ORMOneToOne(targetEntity=Time::class, inversedBy="user", cascade={"persist"})
* @ORMJoinColumn(name="time2_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
*/
private $time2;
...}
事实上,我完美地使用它,但Symfony默默地抱怨(在Symfony工具栏/学说/实体映射>映射错误):
AppEntityUser
The mappings AppEntityUser#time2 and AppEntityTime#user are inconsistent with each other.
显然,Doctrine不喜欢第二个@ORMOneToOne在$ user,并将其丢弃。
这段代码可能导致哪些假设错误行为?
注意:doctrine/common v2.11
只要放弃建立双向关联,就有可能建立这种关系:
User Time
+----------+ +-------+
| ... | | ... |
| time_id |o-----+-----o| |
| | | | |
| time2_id |o-----+ | type |
| ... | +-------+
+----------+
所实现的:
class Time
{
...
}
class User
{
...
/**
* @ORMOneToOne(targetEntity=Time::class, cascade={"persist"})
* @ORMJoinColumn(name="time_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
*/
private $time;
/**
* @ORMOneToOne(targetEntity=Time::class, cascade={"persist"})
* @ORMJoinColumn(name="time2_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
*/
private $time2;
...}
还查看此链接拥有与逆关系.
在我的情况下,这完全符合我的需要,因为相反的部分是方法,如:
$Time->getUser();
,我可以删除。