合并来自同一实体的2个结果

时间:2014-08-30 15:47:26

标签: symfony doctrine-orm

如何合并来自同一实体的2个结果并按日期排序?

我现在只是这个代码:

    $conversations1 = $this->getDoctrine()
                            ->getManager()
                            ->getRepository('AcmeMessageBundle:Conversation')
                            ->getConversations($this->getUser()->getId(), $current);

    $conversations2 = $this->getDoctrine()
                            ->getManager()
                            ->getRepository('AcmeAdosMessageBundle:Conversation')
                            ->getConversationsInverse($this->getUser()->getId(),$current);

但如果我合并对话1和保护2,则日期将无法正确排序。是否有一种简单的方法可以按日期合并和排序?

我知道怎么做。

编辑我的解决方案

$conversations1 = $this->getDoctrine()
                        ->getManager()
                        ->getRepository('AcmeMessageBundle:Conversation')
                        ->getMoreConversations($this->getUser()->getId(), $current, $conversation->getDate()->format('Y-m-d H:i:s'));

$conversations2 = $this->getDoctrine()
                        ->getManager()
                        ->getRepository('AcmeMessageBundle:Conversation')
                        ->getMoreConversationsInverse($this->getUser()->getId(), $current, $conversation->getDate()->format('Y-m-d H:i:s'));

$conversations = array();
foreach (array_merge($conversations1, $conversations2) as $conversation) {
    $conversations[$conversation->getDate()->format('Y-m-d H:i:s')] = $conversation;
}

krsort($conversations);

2 个答案:

答案 0 :(得分:2)

想想你可以将2个数组合并到ArrayCollection中,然后对其进行排序(通过制作迭代器再返回)。

$merged = new ArrayCollection(
    array_merge(
        $conversations1, 
        $conversations2
    )
);

$iterator = $merged->getIterator();

$iterator->uasort(function ($a, $b) {
    return ($a->getDate() < $b->getDate()) ? -1 : 1;
});

$conversations = new ArrayCollection(iterator_to_array($iterator));

这不是最美妙的事情,但它可能会奏效。

注意这是从一堆不同的答案拼凑而成的,所以我不确定实际结果的质量。

答案 1 :(得分:1)

通过在单个SQL语句中检索所有会话(使用SORT BY选项),对查询本身进行排序的最佳方法是查询。数据库在排序结果方面非常有效。如果您无法在存储库代码中实际执行此操作,无论出于何种原因,迭代器(上面发布的)都是一个聪明的解决方案。一种更简单的方法是构造一个会话数组,其中会话日期是数组索引,因此可以对结果进行排序。所以像这样的基本例子:

$conversations = array();
foreach (array_merge($conversations1, $conversations2) as $conversation) {
    $conversations[$conversation->getDate()] = $conversation;
}
sort($conversations);

这应该产生一个日期排序的Conversation对象数组。由于doctrine返回一个对象数组,因此您必须遍历该列表以构建对话数组。