【问题标题】:doctrine2 many to many self referencing with intermediate details教义2多对多自我引用与中间细节
【发布时间】:2011-11-09 15:11:32
【问题描述】:

我想创建一个自引用实体,但带有关于关系的描述(可能还有其他信息)。这方面的一个例子是社交网络应用程序中的朋友 - 人 A(实体)可以与人 B(实体)链接,但是他们的关系可以描述为“朋友”“兄弟”“叔叔”等。

从 Doctrine 文档中,一个类可以使用以下链接表自引用:

<?php
/** @Entity */
class User
{
    // ...

    /**
     * @ManyToMany(targetEntity="User", mappedBy="myFriends")
     */
    private $friendsWithMe;

    /**
     * @ManyToMany(targetEntity="User", inversedBy="friendsWithMe")
     * @JoinTable(name="friends",
     *      joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
     *      inverseJoinColumns={@JoinColumn(name="friend_user_id", referencedColumnName="id")}
     *      )
     */
    private $myFriends;

    public function __construct() {
        $this->friendsWithMe = new \Doctrine\Common\Collections\ArrayCollection();
        $this->myFriends = new \Doctrine\Common\Collections\ArrayCollection();
    }

    // ...
}

但是,您似乎无法使用此方法添加属性。

问题是,有没有办法在单个类(即 User.php)中处理这个问题 - 或者实际上是否必须创建一个“链接”类 - 如 UserLink.php?当我开始建立关系时,我有点卡住了创建链接类:

class UserLink
{
    // ...

    /**
     * @ORM\Column(type="text", nullable=true)
     */
    protected $relationship; // being brother, uncle etc

    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="links")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     * @var type
     */
    private $user;
}

但我不确定接下来会发生什么......?

研究 stackoverflow 我发现了类似的问题,但更多的是关于直接链接。

Doctrine2: Best way to handle many-to-many with extra columns in reference table

Need help understanding Doctrine many to many self referencing code

【问题讨论】:

    标签: php orm doctrine-orm


    【解决方案1】:

    这样解决了:

    用户.php

    /**
     * @ORM\OneToMany(targetEntity="UserLink", mappedBy="user")
     */
    private $relations;    
    

    用户链接.php

    /**
     * @ORM\Column(type="text", nullable=true)
     */
    protected $relationship;
    
    /**
     * @ORM\ManyToOne(targetEntity="User", inversedBy="relations")
     * @ORM\JoinColumn(name="user_ud", referencedColumnName="id")
     */
    protected $user;
    
    /**
     * @ORM\ManyToOne(targetEntity="User")
     * @ORM\JoinColumn(name="related_user_id", referencedColumnName="id")
     */
    protected $relateduser;
    

    它在控制器和模型中需要更多代码,但效果很好。它使用户能够调用 getRelations:

    {% for link in user.relations %}
        {{ link.relateduser.name }} ({{ link.relationship }})
    {% endfor %}
    

    【讨论】:

    • 我正在寻找使用“状态”代码做一些非常相似的事情,这些代码本身具有多对多,以确定在另一个之前或之后允许什么状态。这个解决方案会缺少一种反向查找关系的方法吗?即,如果您有一个用户,您与另一个用户建立了关系,我们就称他为“relatedUser”。现在,如果您从名为“relatedUser”的用户开始并运行 $user->getRelations(),您会找到原始用户吗?我是 symfony 的新手,所以我想弄清楚你的解决方案是否对我有用......
    • 应该双向工作。建议用一些代码示例发布问题。
    猜你喜欢
    • 2013-06-04
    • 1970-01-01
    • 2013-08-04
    • 2018-07-19
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 1970-01-01
    相关资源
    最近更新 更多