我正在尝试按每个协会的分组来获得前N名。在这里,我有2个实体Task
和Event
。 Event
会以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)
现在的问题是,当我尝试将它们映射回我希望有array
个Task
的对象并将其关联结果映射为{{ 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个?