2016-04-29 90 views
2

我有一個數組($newsList)ID與以下值:4,2,1,3保留在Symfony2中的數組的初始順序原則findBy()

我試圖從實體從數據庫中獲取一些數據:

$news=$this->getDoctrine()->getRepository('Bundle:News')->findBy(array('id' => $newsList)); 

$newsList陣列表示從新聞實體真實的ID。

但是當我做:

foreach($news as $n){ 
    $n->getId(); 
} 

ID是爲了:1,2,3,4

如何保存從foreach開始的順序?

回答

1

當你正在做一個全局查詢,你可以通過給定的屬性,一個給定的排序順序排序搜索結果,以便通過前面的回答指出,你可以」噸。

在您的結果排序完全一樣數組你給,你可以這樣做:

$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 
+1

非常感謝!我有一個類似的概念,但錯過了一些關鍵點,那就是訣竅。 – FreakSoft

+0

如果'$ newsList'較大,可能會有很多查詢...;-) –

+0

當然,在進行全局查詢之後過濾結果可能會更好,但是ATM我並沒有考慮到「好」的方法。對於這個小例子,這不是什麼大問題:) – chalasr

3

你不行。

它是從數據庫返回的。如果在查詢中不指定ORDER BY子句,數據庫將返回行,因爲它們在存儲中爲,這通常與id ASC相同。

你應該自己在PHP中對它們進行排序。

1

試試這個:

$news = $this->getDoctrine()->getRepository('Bundle:News')->createQueryBuilder('n') 
     ->where("n.id IN(:Ids)") 
     ->setParameter('Ids', $newsList) // $newsList = array(1,2,3,4,...) 
     ->getQuery() 
     ->getResult(); 
+0

這將生成相同的查詢。這裏會有什麼區別? –

+0

@dragoste我以前不知道 –

0

我不不知道是否實際上可以從返回的查詢結果中對它們進行排序,但是可以執行以下任一選項:

執行foreach循環並執行'findBy對於每個結果一」:

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]; 
} 
0

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功能,可以找到here

相關問題