[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;//全件数

スポンサーリンク


Comment