Order
データベース内のそれぞれにproduct_id
. Product
1注文につき1個のみです。
から、ProductsController
すべての商品を表示し、各商品の隣に注文回数を表示したいと思います。を含む商品を除外する条件を含める必要があります。deleted = 0
Order
データベース内のそれぞれにproduct_id
. Product
1注文につき1個のみです。
から、ProductsController
すべての商品を表示し、各商品の隣に注文回数を表示したいと思います。を含む商品を除外する条件を含める必要があります。deleted = 0
counterCacheも使用します
order_count フィールドを Product テーブルに追加し、 Order モデルを次のように変更します。
class Order extends AppModel {
public $belongsTo = array(
'Product' => array(
'counterCache' => true,
'counterScope' => array('Product.deleted' => 0)
)
);
}
このクエリは、必要な結果を返すはずです。必要に応じて、条件、追加フィールドなどを調整します。
$data = $this->Order->find('all',array(
'fields'=>array(
'COUNT(Product.id)as Count',
'Product.id','Product.name'
),
'group'=>array(
'Product.id'
),
'contain'=>'Product'
));
シンプル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')
));