[CodeIgniter2] SQL_CALC_FOUND_ROWSをActiveRecordで使う
スポンサーリンク
ページネーションなどを表示するとき、データの全件数が必要になりますが、MySQLではそうした時に使うSQL_CALC_FOUND_ROWS
という便利な関数があります。
CodeIgniterのActiveRecordでSQL_CALC_FOUND_ROWS
を使うには、$this->db->select()
の第1引数にSQL_CALC_FOUND_ROWS
を渡し、第2引数をfalse
にします。
$this->db->select('SQL_CALC_FOUND_ROWS columnA,columnB',false); $this->db->from('table_name'); $query = $this->db->get();
$this->db->select()
は、デフォルトでは渡された文字列をバッククオートで囲みます。なので、文字列だけを渡すとSQL_CALC_FOUND_ROWS
がクオートでエスケープされてしまいエラーになります。第2引数にfalseを渡すとエスケープを行いません。これでSQL_CALC_FOUND_ROWS
がActiveRecordで使えるようになります。
上述のコードでは、SELECT SQL_CALC_FOUND_ROWS columnA,columnB FROM table_name
というSQL文が生成されます。
なお、以下の書き方はエラーとなりますので注意が必要です。
$this->db ->select('SQL_CALC_FOUND_ROWS',false) ->select('columnA') ->select('columnB') ->from('table_name'); $query = $this->db->get();
$this->db->serect()
を複数呼び出すと、CodeIgniterは引数で指定された文字列をカンマ区切りでつなぎSQL文を作っていきます。上記の書き方ですと、生成されるSQL文はSELECT SQL_CALC_FOUND_ROWS,columnA,columnB FROM table_name
となります。SQL_CALC_FOUND_ROWSの後ろにカンマが入ってしまい、不正なSQL文となってしまうのです。
なので、SQL_CALC_FOUND_ROWSをアクティブレコードで使う際は、必ずセレクトしたいカラムをつづけて書かなければなりません。
$this->db ->select('SQL_CALC_FOUND_ROWS columnA',false); ->select('columnB') ->from('table_name');
こちらの書き方なら、生成されるSQL文はSELECT SQL_CALC_FOUND_ROWS columnA,columnB FROM table_name
となりエラーとなりません。
全件数を得るには、上述のSQLを実行したあとに以下のコードを実行します。
$total_rows = $this->db->query('SELECT FOUND_ROWS() AS cnt')->row()->cnt;//全件数
スポンサーリンク
CodeIgniterカテゴリーの投稿
- [CodeIgniter3] クエリービルダーのINSERTでエスケープを行わない
- [CodeIgniter3] CRONでコントローラーのメソッドを呼び出す
- [CodeIgniter3] さくらレンタルサーバー設置時の.htaccess
- [CodeIgniter3] ControllerとViewを作成
- [CodeIgniter3] xampp開発環境へのインストール
- [CodeIgniter2] サイトマップを作る
- [CodeIgniter2] form_open()のメソッドをGETにする
- [CodeIgniter2] 多言語化時にオートロードで任意言語ファイルを読み込む
- [CodeIgniter2] ActiveRecordクラスjoinメソッド
- [CodeIgniter2] アクティブレコードでReplace文を使う