2016-09-23 48 views
0

在我的倉庫,我(在使用)有太多的參數的方法:存儲庫的最佳實踐是什麼?

例子:

class ProchaineOperationRepository extends EntityRepository 
{ 
     public function getProchaineOperation(
      $id = null, // Search by ID 
      \DateTime $dateMax = null, // Search by DateMax 
      \DateTime $dateMin = null, // Search by DateMin 
      $title = null // Search by title 
     ) 

在我的控制器,我有型動物的動作......與得到ID,與ID和DateMin獲得,爲得到ID和標題,...

我的方法是太潦草因爲... e太多的論點......並且由於它們幾乎是相同的而難以創建許多方法...

什麼是最佳實踐?

+8

您的第一個最佳做法可能是回答您的問題。這是您在5個小時內發佈的第三個問題。另外兩個人有評論和答案,但沒有回覆你。它看起來像你問了50個問題,只接受了一個答案?讓人驚訝。通過海報駕駛不應期望太多的幫助。 – Cerad

回答

1

如果你的目標是隻與各屬性之間的AND運營商查詢,最好的辦法可能是使用該提議主義方法:

$results = $this 
      ->getDoctrine() 
      ->getRepository('AppBundle:ProchaineOperation') 
      ->findBy(array('dateMax' => $myDate, 'title' => 'Hello world'); 
findBy() CF: this part of the doc

例如

編輯:在評論之後

然後使用與Doctrine相同的方法:只傳遞一個帶有id,dateMax ...的數組作爲鍵如果這些被設置。這應該解決方法簽名問題,這給你很多麻煩。 :)

+0

我的代碼在現實中要複雜得多......我使用RSM和自定義查詢:) –

+0

編輯我的答案 –

2

有兩個主要關注在你的問題

  1. 您的存儲庫方法的參數太多,這將在最終的查詢「其中」條件下使用。要組織他們以更好的方式
  2. 存儲庫方法應該是從控制器調用,因爲傳遞

我建議你寫這樣一個信息庫方法的參數可能複雜有意義的方式:

namespace AcmeBundle\Repository; 

/** 
* ProchaineOperationRepository 
* 
*/ 
class ProchaineOperationRepository extends \Doctrine\ORM\EntityRepository 
{ 
    public function search($filters, $sortBy = "id", $orderBy = "DESC") 
    { 
     $qb = $this->createQueryBuilder("po"); 

     foreach ($filters as $key => $value){ 
      $qb->andWhere("po.$key='$value'"); 
     } 

     $qb->addOrderBy("po.$sortBy", $orderBy); 

     return $qb->getQuery()->getArrayResult(); 
    } 
} 

$filters變量這裏是應該抱着你要在「那裏」的條件使用的過濾器陣列。 $sortBy$orderBy也應該是有用的,正確排序的方式來獲得結果現在

,你可以從你的控制器一樣調用庫方法:

class ProchaineOperationController extends Controller 
{ 
    /** 
    * @Route("/getById/{id}") 
    */ 
    public function getByIdAction($id) 
    { 
     $filters = ['id' => $id]; 

     $result = $this->getDoctrine()->getRepository("AcmeBundle:ProchaineOperation")->search($filters); 
     //process $result 
    } 

    /** 
    * @Route("/getByTitle/{title}") 
    */ 
    public function getByTitleAction($title) 
    { 
     $filters = ['title' => $title]; 
     $sortBy = 'title'; 

     $result = $this->getDoctrine()->getRepository("AcmeBundle:ProchaineOperation")->search($filters, $sortBy); 
     //process $result 

    } 

    /** 
    * @Route("/getByIdAndDateMin/{id}/{dateMin}") 
    */ 
    public function getByIdAndDateMinAction($id, $dateMin) 
    { 
     $filters = ['id' => $id, 'dateMin' => $dateMin]; 
     $sortBy = "dateMin"; 
     $orderBy = "ASC"; 

     $result = $this->getDoctrine()->getRepository("AcmeBundle:ProchaineOperation")->search($filters, $sortBy, $orderBy); 
     //process $result 
    } 

} 

請注意,您所要求的所有相同的庫法控制器操作根據您的參數進行微小的更改。還要注意$sortBy$orderBy是可選的傳遞。

希望它有幫助!

相關問題