
あるカテゴリーの商品の最小価格を取得したいことがありました。
普通に商品IDを拾っていくと面倒くさいので
親のカテゴリーIDを指定すれば
自動的に子や孫のカテゴリーIDをひっぱってくれるような
関数を作ってみました。
子や孫のカテゴリーIDを取得するユーザー関数
親のカテゴリーIDを引数にして
親と子、孫のIDを全てカンマ区切りで返す関数です。
/*カテゴリID取得用ここから*/
function getCategory($id){
// データベースクラス作成
$objQuery =& SC_Query_Ex::getSingletonInstance();
$category_id = $id; //最終id
$stock = array(); //一時結果用
$c_id = $id; //SQL用
$before = 0; //前回の検索結果用
//カテゴリーの最大階層を取得
$level_cols = "MAX(level) AS max";
$level_tables = "dtb_category";
$level_wheres = "del_flg=0";
$level = $objQuery->select($level_cols, $level_tables, $level_wheres);
$max = $level[0][max];
//階層の最大数分繰り返してカテゴリーを取得
for($i = 0; $i < $max; $i++){
$category_cols = "DISTINCT category_id";
$category_tables = "dtb_category";
$category_wheres = "parent_category_id IN ($c_id) AND del_flg=0";
$parent_category_id = $objQuery->select($category_cols, $category_tables, $category_wheres);
if(!empty($parent_category_id)){
foreach($parent_category_id as $pci){
$stock[] = $pci[category_id];
}
$c_id = implode(',' , $stock);
}
$stock = array(); //初期化
//前の結果と比較
if($before != $c_id){
$before = $c_id;
$category_id .= "," . $c_id;
}else{
break;
}
}
$category_id = trim($category_id);//最後の空白を削除
return $category_id;
}
まず、カテゴリーの階層の最大を取って(10~14行目)
その階層の数を基準にループで子、孫のカテゴリーIDを取得します。
子や孫がない場合、EC CUBEは空を返すのではなく
指定したIDがそのまま返ってくるので
同じ結果になったときはループから抜けます。(17~36行目)
結果はカンマ区切りにして返してます。
それを使いたい所で、下記のようにIN検索して使います。
// データベースクラス作成 $objQuery =& SC_Query_Ex::getSingletonInstance(); $id = $this->getCategory(10) $cols = "DISTINCT MIN(a.price01) AS price_min"; $tables = "dtb_products_class AS a, dtb_product_categories AS k, dtb_products AS p"; $wheres = "k.category_id IN ($id) AND a.del_flg=0 AND a.product_id = k.product_id AND a.product_id = p.product_id AND p.status = 1 AND a.price01 IS NOT NULL"; $this->arrPrice = $objQuery->select($cols, $tables, $wheres);
これは全てのカテゴリーを指定して価格を取得してます。
ある階層のカテゴリーIDに子や孫のIDがあるものとないものがあるので
とりあえず、すべてのカテゴリーIDを取得してSELECT検索しています。
もっとスマートなやり方もあるかもしれませんが、
これで今は最小値を取得しています。

