2017-01-13 43 views
0

列の値に従って列をソートする必要があります。上記Doctrine Query Builderでは、order by =エンティティの列名

$vtpQb = $entityManager->createQueryBuilder(); 
       $vtpQb 
       ->from("AppBundle:TrPlace","trplace") 
       ->select($view_fectch_fields) 
       ->join('AppBundle:TrVwPlacePrivateMarkers', 'vwpm','WITH','trplace.id = vwpm.placeId') 
       ->where('vwpm.userid = :userid') 
       ->setParameter("userid",$userid) 
       ->orderBy('vwpm.tagStatusValue', 'DESC'); 
       //->orderBy('vwpm.tagStatusValue = 3', 'DESC'); got errorvwpm.tagStatusValue 

私のクエリであり、私はそれをソートする必要がある「vwpm.tagStatusValue = 3」、どのように私は教義クエリビルダでそれを実現します.....

+0

@DonCallistoもちろんSQLでも可能です。 '' vwpm.tagStatusValue = 3'は 'true'または' false'になり、 '1'または' 0'に変換されます。このようなソート(DESC方向)は、この条件に一致する行が最初になることを意味します。 –

答えて

3

まず最初は、あなたが置くことができないということです式はDQLのorderByにありますが、計算列を使用できます。

も何のMySQLのIFはありませんが、これは私の作品CASE WHEN

があります。 addSelectを追加し、orderBy部分を変更しました。

$vtpQb = $entityManager->createQueryBuilder(); 
      $vtpQb 
      ->from("AppBundle:TrPlace","trplace") 
      ->select($view_fectch_fields) 
      ->addSelect('(CASE WHEN vwpm.tagStatusValue = 3 THEN 1 ELSE 0 END) AS HIDDEN ordCol') 
      ->join('AppBundle:TrVwPlacePrivateMarkers', 'vwpm','WITH','trplace.id = vwpm.placeId') 
      ->where('vwpm.userid = :userid') 
      ->setParameter("userid",$userid) 
      ->orderBy('ordCol', 'DESC'); 

addSelectHIDDENキーワードを注意してください。それなしでは動作しません。