[英]Preserve the initial order of array in Symfony2 Doctrine findBy()
我有一個包含以下值的 ID 數組( $newsList
): 4,2,1,3
。
我正在嘗試從實體的數據庫中獲取一些數據:
$news=$this->getDoctrine()->getRepository('Bundle:News')->findBy(array('id' => $newsList));
$newsList
數組代表來自 News 實體的真實 ID。
但是當我這樣做時:
foreach($news as $n){
$n->getId();
}
ID 依次為: 1,2,3,4
。
如何從 foreach 開始保留順序?
你不能。
這就是從 DB 返回的方式。 如果你不指定ORDER BY
查詢子句,數據庫將返回行,因為他們在存儲,這通常是一樣的id ASC
。
您應該在 PHP 中自行對它們進行排序。
試試這個:
$news = $this->getDoctrine()->getRepository('Bundle:News')->createQueryBuilder('n')
->where("n.id IN(:Ids)")
->setParameter('Ids', $newsList ) // $newsList = array(1,2,3,4,...)
->getQuery()
->getResult();
當您進行全局查詢時,您可以僅按給定的屬性和給定的排序順序對結果進行排序,因此正如前面的答案所指出的那樣,您不能。
要使您的結果完全按照您給出的數組排序,您可以執行以下操作:
$newsList = [3, 1, 4, 2];
$newsRepo = $this->getDoctrine()->getRepository('Bundle:News');
foreach ($newsList as $id) {
$new = $newsRepo->findOneBy['id' => $id];
if ($new !== null) {
$news[] = $new;
}
}
像這樣,您的結果的排序與$newsList
完全一樣,例如:
foreach ($news as $n) {
print $n->getId();
}
// Output: 3 1 4 2
我不知道您是否真的可以從返回的查詢結果中對它們進行排序,但是您可以執行以下任一選項:
執行 foreach 循環並對每個結果執行“findByOne”:
foreach($newsList as $id) {
$news[]=$this->getDoctrine()->getRepository('Bundle:News')->findBy(array('id' => $id));
}
之后對查詢結果進行排序:
$news=$this->getDoctrine()->getRepository('Bundle:News')->findBy(array('id' => $newsList));
foreach($newsList as $id) {
$sorted_news[] = $news[$id];
}
IMO 最好的解決方案是使用field
函數來獲得正確的新聞順序:
$ids = [4, 1, 2, 3];
$news = $this->getDoctrine()->getRepository('Bundle:News')->createQueryBuilder('n')
->select('n, field(n.id, :ids) as HIDDEN field')
->where("n.id IN (:ids)")
->setParameter('ids', $ids )
->orderBy(field)
->getQuery()
->getResult();
注意:此解決方案需要可在此處找到的自定義field
函數。
您可以使用usort和 spaceship 運算符:
$newsList = [4, 2, 1, 3];
$news = $this->getDoctrine()->getRepository(News::class)->findBy(['id' => $newsList]);
$order = array_flip($newsList);
usort($news, function($a, $b) use ($order) {
return $order[$a->getId()] <=> $order[$b->getId()];
});
// $news is now ordered by id 4,2,1,3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.