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

rqmkfv5c  于 2022-12-10  发布在  PHP
关注(0)|答案(1)|浏览(113)

这种一对一的关系可能与学说(在Symfony)?

User                     Time
+----------+             +-------+
| ...      |             | ...   |
| time_id  |o-----+-----o| user  |
|          |      |      | ...   |
| time2_id |o-----+      | type  |
| ...      |             +-------+
+----------+

也就是说,用户可能有两个不同的时间实体与之关联:一个类型=0,另一个类型=1。
我本可以将Time拆分为两个不同的实体,但我认为这样可以避免复制一些代码,因为Time实体有一个eventListener和更多关联的代码...
我把它编码成这样:

class Time
{
...
    /**
     * @ORM\OneToOne(targetEntity=User::class, mappedBy="time, cascade={"persist"})
     * @ORM\OneToOne(targetEntity=User::class, mappedBy="time2", cascade={"persist"})
     */
    private $user;
...}

class User
{
...
    /**
     * @ORM\OneToOne(targetEntity=Time::class, inversedBy="user", cascade={"persist"})
     * @ORM\JoinColumn(name="time_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
     */
    private $time;

    /**
     * @ORM\OneToOne(targetEntity=Time::class, inversedBy="user", cascade={"persist"})
     * @ORM\JoinColumn(name="time2_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
     */
    private $time2;
...}

事实上,我正在完美地使用它,但Symfony默默地抱怨(在Symfony工具栏/Doctrine/实体Map〉Map错误中):

App\Entity\User     

    The mappings App\Entity\User#time2 and App\Entity\Time#user are inconsistent with each other.

显然,Doctrine不喜欢**$user上的第二个@ORM\OneToOne**,并将其丢弃。
这段代码会导致什么样的假仁假义的错误行为?
注:条令/通用v2.11

62lalag4

62lalag41#

FWIW中,只要一个人放弃使Bidirectional Association

User                     Time
+----------+             +-------+
| ...      |             | ...   |
| time_id  |o-----+-----o|       |
|          |      |      |       |
| time2_id |o-----+      | type  |
| ...      |             +-------+
+----------+

执行者:

class Time
{
...
}

class User
{
...
    /**
     * @ORM\OneToOne(targetEntity=Time::class, cascade={"persist"})
     * @ORM\JoinColumn(name="time_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
     */
    private $time;

    /**
     * @ORM\OneToOne(targetEntity=Time::class, cascade={"persist"})
     * @ORM\JoinColumn(name="time2_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
     */
    private $time2;
...}

对于Owning与Inverse关系,也是look at this link
在我的例子中,这完全符合我的需要,因为相反的部分是针对如下方法的:
$Time->getUser();
我能预知。

相关问题