deniev
@deniev

Как получить не взаимные подписки?

Значит есть у меня 2 таблицы:

User
followers | OneToMany | mappedBy="followed"
following | OneToMany | mappedBy="follower"

Follow
followed | ManyToOne | inversedBy="followers"
follower | ManyToOne | inversedBy="following"

Получаю подписчики пользователя таким образом:

$qb ->join('u.following', 'follow')
    ->where('follow.followed = :user')
    ->setParameter('user', $user)

Подписки таким:

$qb ->join('u.followers', 'follow')
    ->where('follow.follower = :user')
    ->setParameter('user', $user)

Теперь мне нужны подписки пользователя, которые не взаимны.
Сделав так, я получаю все взаимные:

$qb ->join('u.followers', 'fs')
    ->join('u.following','fg')
    ->where('fs.follower = :user')
    ->andWhere('fg.followed = :user')
    ->setParameter('user', $user)

По моим надеждам where('fg.followed != :user') должно было как раз вывести не взаимные, но на практике вообще ничего не выводится. Возможно это глупая ошибка, но с БД у меня вечная война, надеюсь на помощь.

Спасибо,
  • Вопрос задан
  • 85 просмотров
Пригласить эксперта
Ответы на вопрос 1
Minifets
@Minifets
Hello world!!!
Не работает, потому что у вас сам запрос на взаимные подписки кривой, и вы плохо понимаете, как работает join. Проблема у вас во 2-ом join. Расписывать лень, поэтому кратко.
У вас в результат всех join получается таблица в которой у пользователя каждый follower сопоставляется с following. Из такой кучи данных выбрать не взаимные подписки просто невозможно.
2-ым запросов вам нужно join-ить не всех following-ов, а только тех у кого followed = fs.follower. Причем использовать left join и проверять потом в where на null.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы