読者です 読者をやめる 読者になる 読者になる

【fuelphp】クエリビルダでSQL_CALC_FOUND_ROWSを実現する方法メモ

はじめに

クエリビルダを無理やり使ってみて、少し慣れてきたらすごい複雑なSQLを書かない限りそこまで困らないかなと思ってきました。ただcoreの中を覗いてみた感じだとページングなどでよく使われるSQL_CALC_FOUND_ROWSを実現する方法がなさそう

で、強引にやるとしたらこんな感じになるのかなぁということでとりあえずやってみた

実装方法

// 検索条件とか
$params = array(
    "category_id" => 1,
);

// 件数取得用
$query_count = DB::select(DB::expr("count(*) as count"));

// リスト取得用
$query_list = DB::select(
    "colum1", "colum2", "colum3",・・・
);

// 件数用とリスト用で同じクエリを準備
$query_count = select_build($query_count, $params);
$query_list = select_build($query_list, $params);

// リスト用クエリには範囲指定やらソート条件やらを追加
$query_list->offset(0);
$query_list->limit(10);
$query_list->order_by("id", "asc");

// 件数取得
$result = DB::query($query_count)->excute()->as_array();
print_r($result); // array[0]["count"] = 件数

// リスト取得
$result = DB::query($query_list)->excute()->as_array();

function select_build(&$query, $params)
{
    $query->from("table1")
               ->join("table2")->on("table1.colum", "=", "table2.colum")
               ->and_where("table2.category_id", "=", DB::expr($params["category_id"]));
}

こんな感じになりました。もう少し汎用的にかけそうだけど、、、
以上です