[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文を使う