2016-05-17 53 views
2

我有實體店所有者,我想統計所有門店,一個所有者,由他們鎮分類。如何使用Doctrine QueryBuilder選擇所有列?

我有這個疑問在我的控制器

$query = $this->getDoctrine()->getRepository('WebBundle:Store') 
    ->createQueryBuilder('s') 
    ->select('t.name, COUNT(s) as counter') 
    ->groupBy('s.town') 
    ->leftJoin('s.owner','o') 
    ->leftJoin('s.town','t') 
    ->where('s.owner = :id') 
    ->orderBy('t.name','ASC') 
    ->setParameter('id', $id) 
    ->getQuery(); 

$list = $query->getResult(); 

有什麼辦法來從鎮,而不是宣佈每列中選擇所有列?類似於->select('t.*, COUNT(s) as counter')。我可以選擇我現在需要的,但對於更大的表格,我需要其他方法。

我試過->select('t, COUNT(s) as counter')但我得到一個異常錯誤。

欲瞭解更多信息,請在我的樹枝模板我想將此:

{% for town in list %} 
    <span>{{ town.name }}</b> [{{ town.counter }}]</span> 
{% endfor %} 

感謝所有的建議!

回答

1

我想你在你的實體中有一些關係。

Owner必須與Store有1-n關係。

所以,你Owner實體會是這樣的:

class Owner 
{ 
    protected $stores; 

    // ... 

    public function __construct() 
    { 
     $this->stores = new ArrayCollection(); 
    } 

    public function getStores() 
    { 
     return $this->stores; 
    } 

    public function setStores($stores) 
    { 
     $this->stores = new ArrayCollection(); 

     foreach ($stores as $store) 
     { 
      $this->stores->add($store); 
     } 

     return $this; 
    } 

    public function addStore(Store $store) // ... can use $this->store->add() 

    public function removeStore(Store $store) // ... can use $this->store->removeElement() 

    // etc ... 

} 

所以,現在,你可以使用Collection::count()主義方法!

$storesCnt = $user->getStores()->count(); 

您想獲得用戶和城鎮的所有商店嗎? 沒問題! Collection::filter()是你的朋友!

$storesForAUserAndAGivenTown = $user->getStores()->filter(function (Store $store) use ($town) { 
    return ($store->getTown() === $town); 
}); 

就是這樣。

考慮到Doctrine的第一條規則是Forget the database !,所以僅在必要時才使用DQL或QueryBuilder。

希望它能幫助你。

+0

Excelent!這有助於很多..感謝您的回答! –

+0

好,不客氣! – ceadreak

+0

糟糕的建議...永遠不要忘記數據庫。你可以在數據庫中以更好的查詢來做更快的事情,而不是10級封裝。而你的過濾器需要數據庫來獲取所有商店,以比較它們的城鎮名稱。我想你從來沒有看到過什麼樣的查詢原則。 –

-1

您可以通過省略列名稱或匹配全部通配符來選擇全部。所以,而不是t.name或t。*,你可以簡單地做t贊Like So:

 $query = $this->getDoctrine()->getRepository('WebBundle:Store') 
       ->createQueryBuilder('s') 
       ->select('t, COUNT(s) AS counter') 
       ->groupBy('s.town') 
       ->leftJoin('s.owner','o') 
       ->leftJoin('s.town','t') 
       ->where('s.owner = :id') 
       ->orderBy('t.name','ASC') 
       ->setParameter('id', $id) 
       ->getQuery(); 

      $list = $query->getResult(); 
相關問題