2011-11-09 62 views
1

我想創建一個自引用實體,但有關於關係的描述(可能還有其他信息)。一個例子就是社交網絡應用中的朋友 - 人A(實體)可以與人B(實體)鏈接,但是他們的關係可以被描述爲「朋友」,「兄弟」,「叔叔」等。doctrine2多對多自我引用與中間細節

學說文檔類可自行參考使用以下鏈接表:

<?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

回答

3

解決這樣的:

user.php的

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

UserLink.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 %} 
+0

我正在尋找使用「狀態」代碼非常相似,其中有許多與自己來確定允許之前或之後允許什麼狀態。這個解決方案是否會缺少一種查找相反關係的方法?即如果您有一個用戶與另一個用戶建立了關係,那麼可以稱他爲「relatedUser」。現在,如果您開始與用戶打電話「relatedUser」並運行$ user-> getRelations(),您會找到原始用戶嗎?我是symfony的新成員,所以我試圖弄清楚你的解決方案是否適合我... – snoop168

+0

應該同時工作。用一些代碼示例建議發佈一個問題。 – mogoman