原则:同一个属性可以与两个不同的目标属性建立关系吗?



这种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();

,我可以删除。

最新更新