Doctrine query builder 按兴趣查找

Doctrine query builder find by interests

今天我有一个感兴趣的任务——实现一些组对数据库的搜索,并按最相关的标准对其进行排序

  1. 我们在 Symfony 上有 2 个具有多对多关系的实体(用户和兴趣)
  2. 我们需要创建查询以查找兴趣最相似的用户 例如:

    用户 1 有兴趣 [1,2,3,4,5]

    用户 2 有兴趣 [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;
...

我不知道如何很好地组织它,有人可以帮助我吗? 谢谢!

一种方法

  1. 在您的列表中查找至少有 1 个兴趣的用户(简单 Dql 查询)
  2. 计算 php 中共同兴趣的数量。
    例如使用 count(array_intersect($userInterestsIds, $wantedIds))

  3. 你想要的信息都有了,想怎么显示就怎么显示

我建议您使用简单的 sql(不是 DQL)以便仅提取符合条件的用户 ID。 一个简单的查询可以是:

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;

希望对您有所帮助