Как различать и пересекать массивы массивов, ссылающихся на многие-ко-многим

У меня есть отношение «многие ко многим» в моем пользовательском объекте.

// 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 (сгенерированный в объекте пользователя) возвращает все записи MyFriends и FriendWithMe, если друзья взаимны =(

Я попытался изучить Критерии, но это не работает с отношениями "многие ко многим".


person Andrey Kryukov    schedule 18.09.2014    source источник


Ответы (1)


Я думаю, что в вашей структуре дизайна есть общая проблема. Самореферентные отношения в доктрине равны взаимным отношениям. Заявление о том, что не оба пользователя дружат друг с другом, больше похоже на запрос друзей. Возможно, вам следует изменить это поведение, чтобы иметь отношение on для 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
person tjoussen    schedule 18.09.2014
comment
Хммм... но если (usrA друг с usrB)&&(usrB не друг с usrA) стандартные функции (getMyFriends и getFriendsWithMe) работают правильно. Итак, самореферентные отношения в доктрине НЕ равны взаимным отношениям? Хм... Кажется, я не понимаю чего-то важного - person Andrey Kryukov; 18.09.2014