2015-06-17 47 views
0

我想在從DBB中檢索到對象的屬性(COMMENTS)後重新排序我的對象(ARTICLE的實例)的屬性(COMMENTS)。這可能嗎?Synfony中某個對象的訂單屬性

我的目標是文章,它與評論(其定義爲在實體文章的集合)

我知道我可以通過倉庫訂單,但我的意見的順序取決於許多條件下,一些不可通過數據庫獲得。

條件爲例: 我想在頂部,其屬性show_first被設置爲true,無論他們的得分,然後將其他意見取決於他們的得分下令評論。

+0

,你在想什麼樣的排序嗎?您可以在存儲庫調用中創建隱藏字段並按順序排序,而不是每次都需要處理完整的對象集合。 – qooplmao

+0

@Qoop確定你的意思是創建一個attribut,按照期望的安排對評論進行排序? –

+0

僅在查詢中。我會添加一個答案。 – qooplmao

回答

1

到您查詢的是,在順序排序的事情,你想,這樣你就不需要處理完整的ArrayCollection排序你可以添加一個隱藏字段。

public function findByArticleInOrderOfState() 
{ 
    return $this->createQueryBuilder('c') 
     ->select('c') 
     ->addSelect(' 
      CASE 
       WHEN c.state = :state_new THEN 1 
       WHEN c.state = :state_viewed THEN 2 
       WHEN c.state = :state_deleted THEN 3 
       ELSE 4 
      END AS HIDDEN order_by 
     ') 
     ->setParameter('state_new', 'new') 
     ->setParameter('state_viewed', 'viewed') 
     ->setParameter('state_deleted', 'deleted') 
     ->orderBy('order_by', 'ASC') 
     ->addOrderBy('c.createdAt', 'ASC') 
     ->getQuery() 
     ->getResults(); 
} 

這將產生一個隱藏字段order_by,並設置取決於對象的當前狀態,則它會通過隱藏的字段順序,然後createdAt

這樣排序的評論並沒有意義,但它確實顯示了你如何做到這一點。有了更多關於實際使用案例的信息,我會(希望)能夠使工作更接近您的特定需求。

更新

在你的情況,當你有show_first == 'yes'|'no'你可以做以下..

public function findByArticleInOrderOfState() 
{ 
    return $this->createQueryBuilder('c') 
     ->select('c') 
     ->addSelect(' 
      CASE 
       WHEN c.show_first = :show_first THEN 1 
       ELSE 2 
      END AS HIDDEN order_by 
     ') 
     ->setParameter('show_first', 'yes') 
     ->orderBy('order_by', 'ASC') 
     ->addOrderBy('c.createdAt', 'ASC') 
     ->getQuery() 
     ->getResults(); 
} 
+0

好的謝謝,我編輯我的問題,例如條件。所以爲了滿足我的需要,如果我明白你的答案,我可以做**當c.show_first =「true」THEN 1 ELSE 2.然後 - > orderBy('order_by','ASC') - > addOrderBy(' c.score','DESC')** –

+0

也許只是** CASE當c.show_first THEN 1 ELSE 2 END HIDDEN order_by **,因爲它是一個布爾值。 – qooplmao

+0

我從symfony **得到了以下消息** [Syntax Error] line 0,col 57:Error:Expected Literal,got'''** –

1

在您的Article實體中設置評論的獲取者(getComments())以按照您想要的順序獲取評論。

public function getComments(){ 
    $iterator = $comments->getIterator(); 
    $iterator->uasort(function ($a, $b) { 
     // change getProperty() with the field you want to order on 
     return ($a->getProperty() < $b->getProperty()) ? -1 : 1; 
    }); 
    $comments= new ArrayCollection(iterator_to_array($iterator)); 
    return $comments; 
} 

欲瞭解更多相關信息請訪問這個帖子"usort" a Doctrine\Common\Collections\ArrayCollection?

+0

是否會根據此函數對命令進行排序,如果我從存儲庫的查詢中觸發了文章和註釋? –

+0

我沒有得到你想要的東西,你可以在從存儲庫中獲取它們的同時對它們進行排序,或者使用我的答案將它們排列在getter中。你也可以這樣做,這取決於你的訂單邏輯 – zizoujab

相關問題