Построение доктрин запросов по интересам

Сегодня у меня есть интересная задача - реализовать поиск по БД по некоторым группам и отсортировать по наиболее релевантным критериям

  1. У нас есть 2 объекта (Пользователь и Интересы) на Symfony с отношением ManyToMany
  2. Нам нужно создать запрос для поиска пользователей, которые имеют наиболее похожие интересы, например:

    У user1 есть интересы [1,2,3,4,5]

    У user2 есть интересы [1,2,4,5,7]

    У user3 есть интересы [3,5]

мы пытаемся найти пользователя с интересами [2,6,7] и результат должен быть:

[user2, user1, user0]

user2 - 2 similar interests

user1 - 1 similar interests

user3 - 0 

Пример кода:

class User
{
    // ...

    /**
     * Many Users have Many Interests.
     * @ManyToMany(targetEntity="Interest")
     * @JoinTable(name="users_interests",
     *      joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
     *      inverseJoinColumns={@JoinColumn(name="interest_id", referencedColumnName="id")}
     *      )
     */
    private $interests;
...

Я понятия не имею, как это организовать, кто-нибудь может мне помочь? Спасибо!

2 ответа

Решение

Я предлагаю вам использовать простой sql (не DQL), чтобы извлечь только идентификатор пользователя, который соответствует критериям. Простой запрос может быть:

select distinct user_id, count(*) from users_interests
where interest_id in (1,3,5) --- your interest ids
group by 1
order by 2 DESC;

Надеюсь это поможет

Один из способов сделать это

  1. Найдите пользователя с хотя бы одним интересом из вашего списка (простой запрос Dql)
  2. Подсчитайте количество общих интересов в php.
    Например, используя count(array_intersect($userInterestsIds, $wantedIds))

  3. У вас есть вся необходимая информация, отображайте ее как хотите

Другие вопросы по тегам