如何合并来自同一实体的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);
答案 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返回一个对象数组,因此您必须遍历该列表以构建对话数组。