2016-05-17 15 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() Doctrineの方法を使用することができます!

$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レベルのラッパーを使用して、素早くデータベースで作業を行うことができます。そして、あなたのフィルタは、町の名前のためにそれらを比較するためにデータベースがすべての店をフェッチするように要求します。あなたはdoctrineが何をしているのか見たことはないと思う。 –

-1

マッチするすべてのワイルドカードのような列名を省略して、すべてを選択できます。したがって、t.nameまたはt。*の代わりに、単に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(); 
関連する問題