1

我在Symfony2中創建應用程序。這是我第一次開發使用框架和我的第一個項目之一。這是一個學生項目。Symfony2最佳實踐 - 實體排序

在這個項目中,我希望我的實體集合在到達視圖之前進行排序。這可以通過以下方式完成:

在獲取多對一關係上的實體的方法中,在getter中的usort()方法所使用的多方比較器方法中,側。在下面,我有一種方法也填補了「日」實體集合中的空白(日記形式),但重點在於它用usort來排序日子。

在用戶實體類:

public function getDaysWithNulls() 
    { 
    $days = $this->getDays()->toArray(); 
    //get the first day and find out how many days have passed 
    usort($days, array("\Pan100\MoodLogBundle\Entity\Day", "daySorter")); 
    $firstEntry = $days[0]; 
    $interval = $firstEntry->getDate()->diff(new \DateTime()); 
    $numberOfDaysBack = $interval->d; 
    //create an array consisting of the number of days back 
    $daysToShow = array(); 
    for ($i=0; $i < $numberOfDaysBack ; $i++) { 
     $date = new \DateTime(); 
     $date->sub(new \DateInterval('P' . $i . 'D')); 
     $daysToShow[] = $date; 
    } 
    $daysToReturn = array(); 
    foreach ($daysToShow as $day) { 
     //figure out if this day has an entity, if not set an empty Day object 
     $dayEntityToProcess = new \Pan100\MoodLogBundle\Entity\Day(); 
     $dayEntityToProcess->setDate($day); 
     foreach ($days as $dayEntity) { 
      //check if there is a day entity 
      if($day->format('Y-m-d') == $dayEntity->getDate()->format('Y-m-d')) { 
       $dayEntityToProcess = $dayEntity; 
      } 
     } 
     $daysToReturn[] = $dayEntityToProcess; 
    } 
    //return a collection 
    return new \Doctrine\Common\Collections\ArrayCollection($daysToReturn); 
} 

usort使用這個在日實體類:

static function daySorter($dayEntity1, $dayEntity2) { 
    $interval = $dayEntity1->getDate()->diff($dayEntity2->getDate()); 
    if($interval->invert == 1) { 
     return +1; 
    } 
    else if ($interval->invert == 0) { 
     return 0; 
    } 
    else return -1; 
} 

我的問題是:這是排序並返回排序集合中的最佳實踐,或應該在其他地方進行排序嗎?

+0

一點的話:我讀的地方,一個不應該在實體類中使用EntityManager進行查詢,因爲它將圖層連接起來。否則,我可以查詢EntityManager的日期排序日期。 – Piddien

回答

1

我確實認爲這是一個泰迪歐的做法。所以我在網上搜索了一下,然後閱讀了一些內容,發現我可以創建自定義存儲庫。

我將這樣做,而不是:

http://symfony.com/doc/2.1/book/doctrine.html#custom-repository-classes

編輯:發現了排序在註釋做得更好:

/** 
* @ORM\OneToMany(targetEntity="Day", mappedBy="user_id") 
* @ORM\OrderBy({"date" = "DESC"})  
**/  
protected $days;