2013-07-16 88 views
13

我想創建一個窗體與數據集合類型取決於正在登錄的用戶。我正在關注this chapter of the Symfony cookbookSymfony表單query_buider和實體存儲庫

query_builder選項是我從DQL獲取數據的閉包時,一切正常。由於數據需要從代碼中的不同位置獲取,因此我希望在Repository類中定義查詢。

這裏是我的倉庫的功能:在控制器調用,並返回第一個數組時

public function findOwnedBy($user) { 
    $query = $this->getEntityManager()->createQuery("SELECT l FROM MyBundle:Article a JOIN a.owndBy u WHERE u.id = :userId"); 
    $query->setParameters(array("userId"=>$user->getId())); 
    return $query->getResult(); 
} 

此功能。下面是symfony的文檔的一個片段:

$formOptions = array(
        'class' => 'Acme\DemoBundle\Entity\User', 
        'multiple' => false, 
        'expanded' => false, 
        'property' => 'fullName', 
        'query_builder' => function(EntityRepository $er) use ($user) { 
         // build a custom query, or call a method on your repository (even better!) 
        }, 
       ); 

當我把電話給我在query_builder庫函數,我得到一個錯誤:Expected argument of type "Doctrine\ORM\QueryBuilder", "array" given,這我能理解,因爲我的倉庫返回實體的數組,而不是一個QueryBuilder。

我不想重複代碼並在窗體中創建一個新的QueryBuilder。從Repository使用查詢的最佳實踐是什麼?我想在倉庫中有兩個函數,一個返回一個數組,另一個返回QueryBuilder,但在Symfony文檔中的註釋「」或調用倉庫中的一個方法(甚至更好!)「讓我覺得有更好的方法對於這種情況。

回答

24

它應該很容易。執行以下操作:

public function queryOwnedBy($user) { 

    $query = $this->createQueryBuilder('a') 
      ->from('MyBundle:Article', 'a') 
      ->innerJoin('a.owndBy', 'u') 
      ->where('u.id = :id')     
      ->setParameter('id', $user->getId()); 

    return $query; 
} 

public function findOwnedBy($user) { 
    return $this->queryOwnedBy($user) 
      ->getQuery() 
      ->getResult(); 
} 

然後在表單生成器:

$formOptions = array(
    'class' => 'Acme\DemoBundle\Entity\User', 
    'multiple' => false, 
    'expanded' => false, 
    'property' => 'fullName', 
    'query_builder' => function(EntityRepository $er) use ($user) { 
     return $er->queryOwnedBy($user); 
    }, 
); 

編輯

感謝對ncatnow和鰻魚我已經改變了以前的功能返回QueryBuilder的

+0

我也雖然它應該很容易,這是我的第一次嘗試。這會返回錯誤'預期參數的類型「Doctrine \ ORM \ QueryBuilder」,「array」given'。看起來'query_builder'需要一個QueryBuilder對象,不管它是直接給出的還是由閉包返回的。 – Florent

+0

編輯帖子。創建兩個函數,在該函數上返回查詢,另一個函數返回結果。在表單構建器上調用返回查詢的函數。這應該工作,仍然是乾的。對不起,我會更改名稱,因爲它們不合適。 – saamorim

+0

呵呵,這的確是我所做的和我在問題的最後一段中描述的。我會這麼做,Symfony的文檔中的小評論讓我們認爲它可以開箱即用,這很令人困惑;) – Florent

8

我只是做了一些saamorim答案的修復。工作代碼將是這樣的:

public function queryOwnedBy($user) { 

    $query = $this->createQueryBuilder("u") 
      ->where('u.id = :id')     
      ->setParameter('id', $user->getId()); 

    return $query; 
} 

public function findOwnedBy($user) { 
    return $this->queryOwnedBy($user) 
      ->getQuery() 
      ->getResult(); 
} 
+0

謝謝。我已將您的答案集成到了我的帖子中,並根據示例將查詢更改爲了。 – saamorim