Построение доктрин запросов по интересам
Сегодня у меня есть интересная задача - реализовать поиск по БД по некоторым группам и отсортировать по наиболее релевантным критериям
- У нас есть 2 объекта (Пользователь и Интересы) на Symfony с отношением ManyToMany
Нам нужно создать запрос для поиска пользователей, которые имеют наиболее похожие интересы, например:
У 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;
Надеюсь это поможет
Один из способов сделать это
- Найдите пользователя с хотя бы одним интересом из вашего списка (простой запрос Dql)
Подсчитайте количество общих интересов в php.
Например, используяcount(array_intersect($userInterestsIds, $wantedIds))
У вас есть вся необходимая информация, отображайте ее как хотите