2016-04-29 15 views
2

私は配列の($newsList)以下の値を持っています:4,2,1,3Symfony2の配列の初期の順序を保持するDoctrine 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

あなたがグローバルクエリを行っていると、前の回答で指摘したようにして、あなただけの、与えられたプロパティ、および特定のソート順で検索結果を注文することができ、あなたができます」 t。このよう

$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

できません。

DBからの返却方法です。クエリに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

Iドンあなたの結果はあなたが与えられた配列は、あなたがこれを行うことができます正確に命じているように

実際に返すクエリの結果からソートすることができるかどうかは分かりますが、次のいずれかのオプションを使用できます。

foreachループを実行して 'findByそれぞれの結果の一つ」:

foreach($newsList as $id) { 
    $news[]=$this->getDoctrine()->getRepository('Bundle:News')->findBy(array('id' => $id)); 
} 

注文は、その後、クエリの結果:

$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(); 

$news=$this->getDoctrine()->getRepository('Bundle:News')->findBy(array('id' => $newsList)); 
foreach($newsList as $id) { 
    $sorted_news[] = $news[$id]; 
} 
0

IMO最善の解決策は、適切なニュースの順序を取得するにはfield機能を使用することです注:このソリューションでは、というカスタムのfield関数が必要です。

関連する問題