如何区分和交叉多对多自引用ArrayCollections

时间:2014-09-18 12:26:32

标签: symfony doctrine-orm many-to-many self-reference self-referencing-table

我的用户实体中有多对多的自引用关系。

// Acme\DemoBundle\Resources\config\doctrine\User.orm.yml
Acme\DemoBundle\Entity\User:
    type: entity
    repositoryClass: Acme\DemoBundle\Entity\Repository\UserRepository
    table: users
    id:
        id:
            type: integer
            generator: { strategy: AUTO }
    fields:
        username:
            type: string
            length: 25
            unique: true
    manyToMany:
        friendsWithMe:
            targetEntity: User
            mappedBy: myFriends
        myFriends:
            targetEntity: User
            inversedBy: friendsWithMe
            joinTable:
                name: friends
                joinColumns:
                    user_id:
                        referencedColumnName: id
                inverseJoinColumns:
                    friend_user_id:
                        referencedColumnName: id

现在我想获得三个不同的用户集合:

  1. MyFriends - myFriend == true和friendWithMe == false
  2. 的实体集合
  3. FriendWithMe - myFriend == false和friendWithMe == true的用户集合
  4. MutualFriends - myFriend == true和friendWithMe == true的用户集合
  5. Standart getMyFriends getFriendsWithMe(在用户实体中生成)返回所有 MyFriends FriendWithMe 记录,如果朋友互相=(

    我试图深入研究标准的一面,但它不适用于多对多关系。

1 个答案:

答案 0 :(得分:0)

我认为您的设计结构存在一般性问题。学说中的自我引用关系等于相互关系。不是两个用户都是彼此的朋友的状态听起来更像是FriendsRequest。也许你应该改变这种行为,以便与MutualFriends和MyFriendRequests和RecievedFriendRequest的两个不同关系建立关系。

另一种可能性是使用像“友谊”这样的关系实体,这看起来像

// Acme\DemoBundle\Resources\config\doctrine\Friendship.orm.yml
Acme\DemoBundle\Entity\Friendship:
    type: entity
    repositoryClass: Acme\DemoBundle\Entity\Repository\FriendshipRepository
    table: friendship
    id:
        id:
            type: integer
            generator: { strategy: AUTO }
    fields:
        user_one_accepted:
            type: boolean
        user_two_accepted:
            type: boolean
    manyToOne:
        user_one:
            targetEntity: User
        user_two:
            targetEntity: User