スポンサードリンク
あるカテゴリーの商品の最小価格を取得したいことがありました。
普通に商品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検索しています。
もっとスマートなやり方もあるかもしれませんが、
これで今は最小値を取得しています。
スポンサードリンク