2011-11-09 105 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