1

Orderデータベース内のそれぞれにproduct_id. Product1注文につき1個のみです。

から、ProductsControllerすべての商品を表示し、各商品の隣に注文回数を表示したいと思います。を含む商品を除外する条件を含める必要があります。deleted = 0

4

3 に答える 3

3

counterCacheも使用します

order_count フィールドを Product テーブルに追加し、 Order モデルを次のように変更します。

class Order extends AppModel {
    public $belongsTo = array(
        'Product' => array(
            'counterCache' => true,
            'counterScope' => array('Product.deleted' => 0)
        )
    );
}
于 2013-01-16T08:27:19.690 に答える
2

このクエリは、必要な結果を返すはずです。必要に応じて、条件、追加フィールドなどを調整します。

$data = $this->Order->find('all',array( 
   'fields'=>array(
       'COUNT(Product.id)as Count',
       'Product.id','Product.name'
   ), 
   'group'=>array(
       'Product.id'
   ), 
   'contain'=>'Product' 
));
于 2013-01-16T23:32:23.597 に答える
1

シンプルfind('count')で十分です (この検索操作の詳細はクックブックにあります):

// Get a list of all the active products
$products = $this->Product->find('list', array(
    'conditions' => array('Product.deleted' => 0)
));

// Loop over the products
foreach($products as $product_id => $product) {
    $count = $this->Product->Order->find('count', array(
        'conditions' => array('Order.product_id' => $product_id)
    ));
    echo "There were " . $count . " orders for " . $product;
}

Mark が提案したように、aGROUP BYもトリックを実行し、単一の検索を使用してプロセスを簡素化する必要があります。

$count = $this->Product->Order->find('count', array(
    'conditions' => array(
        'Order.product_id' => $product_id,
        'Product.deleted' => 0
    ),
    'group' => array('Order.product_id')
));
于 2013-01-15T18:28:28.277 に答える