我想在從DBB中檢索到對象的屬性(COMMENTS)後重新排序我的對象(ARTICLE的實例)的屬性(COMMENTS)。這可能嗎?Synfony中某個對象的訂單屬性
我的目標是文章,它與評論(其定義爲在實體文章的集合)
我知道我可以通過倉庫訂單,但我的意見的順序取決於許多條件下,一些不可通過數據庫獲得。
條件爲例: 我想在頂部,其屬性show_first被設置爲true,無論他們的得分,然後將其他意見取決於他們的得分下令評論。
我想在從DBB中檢索到對象的屬性(COMMENTS)後重新排序我的對象(ARTICLE的實例)的屬性(COMMENTS)。這可能嗎?Synfony中某個對象的訂單屬性
我的目標是文章,它與評論(其定義爲在實體文章的集合)
我知道我可以通過倉庫訂單,但我的意見的順序取決於許多條件下,一些不可通過數據庫獲得。
條件爲例: 我想在頂部,其屬性show_first被設置爲true,無論他們的得分,然後將其他意見取決於他們的得分下令評論。
到您查詢的是,在順序排序的事情,你想,這樣你就不需要處理完整的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();
}
好的謝謝,我編輯我的問題,例如條件。所以爲了滿足我的需要,如果我明白你的答案,我可以做**當c.show_first =「true」THEN 1 ELSE 2.然後 - > orderBy('order_by','ASC') - > addOrderBy(' c.score','DESC')** –
也許只是** CASE當c.show_first THEN 1 ELSE 2 END HIDDEN order_by **,因爲它是一個布爾值。 – qooplmao
我從symfony **得到了以下消息** [Syntax Error] line 0,col 57:Error:Expected Literal,got'''** –
在您的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?
是否會根據此函數對命令進行排序,如果我從存儲庫的查詢中觸發了文章和註釋? –
我沒有得到你想要的東西,你可以在從存儲庫中獲取它們的同時對它們進行排序,或者使用我的答案將它們排列在getter中。你也可以這樣做,這取決於你的訂單邏輯 – zizoujab
,你在想什麼樣的排序嗎?您可以在存儲庫調用中創建隱藏字段並按順序排序,而不是每次都需要處理完整的對象集合。 – qooplmao
@Qoop確定你的意思是創建一個attribut,按照期望的安排對評論進行排序? –
僅在查詢中。我會添加一個答案。 – qooplmao