在Symfony中根据日期和count()获取mysql结果

时间:2017-03-22 20:42:22

标签: mysql sql symfony

在这种情况下我有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中的答案也足够了。

1 个答案:

答案 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;"

我还没有测试过这段代码,所以请告诉我是否可以使用/不进行修改。