Symfony主义协会按组别排名前N位

时间:2019-11-18 09:42:54

标签: php sql postgresql symfony doctrine

我正在尝试按每个协会的分组来获得前N名。在这里,我有2个实体TaskEventEvent会以30s到2min的间隔(基本上非常频繁)异步添加到db。可以有任意数量的Task,并且每个Event都很多。

class Task
{
    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Event", mappedBy="task", orphanRemoval=true)
     * @ORM\OrderBy({"createdAt" = "DESC"})
     *
     * @Serializer\Groups("default")
     */
    private $event;

}

class Event
{
    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Task", inversedBy="event")
     * @ORM\JoinColumn(nullable=false)
     */
    private $task;
}

我正在使用postgresql db,获取此类数据的唯一方法是使用原始sql

SELECT t.*, xe.* FROM task t
    LEFT JOIN (
        SELECT
            t.id,
            t.task_id,
            /* the rest of the fields except rank field */
        FROM (
            SELECT *, ROW_NUMBER() OVER (Partition by task_id ORDER BY created_at DESC ) AS rank
            FROM event e
        ) as t WHERE rank <= 15
    ) xe on (xe.taks_id = t.id)

现在的问题是,当我尝试将它们映射回我希望有arrayTask的对象并将其关联结果映射为{{ 1}}字段关联。

基本上我正在尝试映射这样的结果

Events

它被映射错误。返回结果是平面表。

event

发生的事情是,数据被映射为$em = $this->getEntityManager(); $rsm = new ResultSetMappingBuilder($em); $rsm->addRootEntityFromClassMetadata(Task::class, 't'); $rsm->addJoinedEntityResult(Event::class, 't', 'e', 'event'); $rsm->addFieldResult('t', 't.id', 'id'); $q = $em->createNativeQuery($sql, $rsm); $q->getResult(); 的数组,并且字段也包含错误的数据。

如何正确映射数据,或者有没有更好的方式按关联组将前{个+------+-------+ | t.id | xe.id | +------+-------+ | 1 | 1 | | 1 | 3 | | 1 | 4 | | 1 | 10 | | 1 | 12 | | 2 | 2 | | 2 | 5 | | 2 | 6 | +------+-------+ 个数组排在前N个?

0 个答案:

没有答案