2016-12-21 15 views
0

ORM QueryBuilderに大きな問題があります。私がする必要があるのは: orderの数がproductsであり、関連するエンティティ(orderに関連付けられている)がたくさんありますが、ここでは関係ないと思います。私もその数だけ結果を注文する必要があります。Doctrine2 QueryBuilderはエンティティと関連するエンティティの数を選択します

私はこれをどのように達成できるかの例を教えてください。可能であれば、 "インライン" DQLを避けたいと思います。

+0

私は約2つのソリューションを考えます。まず、注文テーブルの製品の数を維持することは、複雑で遅いクエリを避けることです。 2番目はDQLを[DTO](http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#new-operator-syntax)と共に使用することです。 object –

+0

また、すでに製品を取得している場合はPHPでカウントします。 –

+0

@ skowron-lineこれは実行可能ではありません。次のステップでは、製品のステータスによって「カウント」をフィルタリングする必要があり、実際に頻繁に更新されるためです。私はフィールドをカウントするために不必要な更新を避けたいと思います。また、それは正規化に反する。 – user1970395

答えて

2

Doctrine Query Builderでデータを取得できます。

あなたはOrderから商品をジョイントし、次に注文IDでグループ化します。あなたのselectステートメントにCOUNT(product.id)があり、order by句のエイリアスを使って注文を並べ替えることができます。以下はRepositoryの小さなコードスニペットです。

/** 
* @return \Doctrine\ORM\Query 
*/ 
public function getHotelAndRoomType() 
{ 
    $qb = $this->createQueryBuilder('order') 
     ->select('partial order.{id, orderId} as order, count(product.id) as total_products_in_order') 
     ->leftJoin('AppBundle:Product', 'product', 'WITH', 'product.order = order.id') 
     ->groupBy('order.id') 
     ->orderBy('total_products_in_order', 'DESC') 
    ; 

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

注:コードはテストされていません。

+0

期待どおりに動作する、これは私が探していた正しい解決策です。 – user1970395

関連する問題