【问题标题】:How to diff and intersect Many-To-Many Self-referencing ArrayCollections如何区分和相交多对多自引用 ArrayCollections
【发布时间】:2014-09-18 12:26:31
【问题描述】:

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

// 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. FriendWithMe - myFriend == false 和friendWithMe == true 的用户集合
  3. MutualFriends - myFriend == true 和friendWithMe == true 的用户集合

标准 getMyFriends 和 getFriendsWithMe(在用户实体中生成)返回所有 MyFriendsFriendWithMe 记录,如果朋友是相互的 =(

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

【问题讨论】:

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


    【解决方案1】:

    我认为您的设计结构存在普遍问题。教义中的自指关系等于相互关系。并非两个用户彼此都是朋友的状态听起来更像是 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
    

    【讨论】:

    • 嗯...但是如果(usrA 与 usrB 成为朋友)&&(usrB 不是 usrA 的朋友)标准函数(getMyFriends 和 getFriendsWithMe)可以正常工作。所以学说中的自指关系不等于相互关系?嗯...好像我不明白一些重要的事情
    猜你喜欢
    • 2016-11-18
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 2015-04-06
    • 2017-02-01
    相关资源
    最近更新 更多