在这种情况下我有4个相关的表
USER
-userid
GROUPMEMBER
-userid -groupId
POST
-groupId -dateCreated
POSTBUMP
-userid -postId
我想创建一个函数getTrendingPosts($ user_id,$ date),其中$ user_id是当前用户,$ date是我想要包含结果的当前日期的距离。
所以想法是
首先获取用户所在的群组
第二次获取我们为用户找到的组中的帖子并且在时间范围内
根据postbumps的count()对这些帖子进行第三次订购
我可以做前两位,但我无法弄清楚如何做第三位。同时,如果可以在2或甚至1中进行查询,我不想使用3个查询。
表示第一个,(返回包含id的组实体)
v
对于第二个(我最终为每个组ID调用它,尽管试图一次性完成)
public function getGroupsIdByUserId($user_id){
$qb=$this->repository->createQueryBuilder('x');
$qb->select('AppBundle:GroupMember');
$qb->where('x.userId = :userId');
$qb->setParameter('userId',$user_id);
return $qb->getQuery()->getResult();
}
查询是通过symfony使用查询构建器函数完成的,虽然我更关心查询的实际逻辑,所以即使是普通SQL中的答案也足够了。
答案 0 :(得分:1)
所以你想要的基本SQL是:
public function getTrendingPosts($user_id, $date){
$em = $this->container->get('doctrine.orm.entity_manager');
$qb2 = $em->getRepository('AppBundle:GroupMember')->createQueryBuilder('o2');
$qb=$em->createQueryBuilder('x');
$qb->select('count(o.postId), o.postId')
->from('AppBundle:Post')
->innerJoin('AppBundle:PostBump', 'o', 'WITH', 'o.userId = :userId AND o.postId = x.postId')
->where('x.dateCreated < :dateCreated')
->andWhere($qb->expr()->in(
'x.groupid',
$qb2->select('o2.groupid')
->where('o2.userid = :userId')
->getDQL()
))
->setParameter('dateCreated',$date)
->setParameter('userId',$user_id)
->addGroupBy('count(o.postId), o.postId')
->addOrderBy('count(o.postId)', 'DESC')
;
return $qb->getQuery()->getResult();
}
要在一个功能中实现此功能,您可以执行以下操作:
style="float: right;"
我还没有测试过这段代码,所以请告诉我是否可以使用/不进行修改。