Doctrines查询构建器按兴趣查找

时间:2017-11-15 08:49:38

标签: symfony doctrine-orm doctrine-query

今天我有一项兴趣任务 - 实现某些团队对数据库的搜索,并按照最相关的标准对其进行排序

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

    user1有兴趣[1,2,3,4,5]

    user2有兴趣[1,2,4,5,7]

    user3有兴趣[3,5]

  3. 我们尝试找到感兴趣的用户[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 个答案:

答案 0 :(得分:2)

一种方法

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

  3. 您拥有所有想要的信息,并根据需要显示

答案 1 :(得分:1)

我建议你使用简单的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;

希望这个帮助