スポンサードリンク

EC CUBE
EC CUBE

あるカテゴリーの商品の最小価格を取得したいことがありました。

普通に商品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検索しています。

もっとスマートなやり方もあるかもしれませんが、

これで今は最小値を取得しています。

スポンサードリンク