CodeIgniter 3 Query Builder

CodeIgniter 3 Query Builder

公式のマニュアルはここです。

つぎは誰もが必ず使うであろうDB関連の説明。
DBの中でもQuery Builderの新機能を書いていこうと思います。
CI2ではActive Recordってなってたと思うのですがCI3からQuery Builderに名前が変わりました。 基本的にはコードは変わってはいないのですが、新機能で以前はできなかったより複雑なSQLを発行できるようになっています。

get_compiled_select()、get_compiled_insert() {#get_compiled_selectget_compiled_insert}

$this->db->where('field01', 'hogehoge');
$this->db->limit(10, 20);
$sql = $this->db->get_compiled_select('table');
// $sql = SELECT * FROM `table` WHERE `field01` = 'hogehoge' LIMIT 20, 10
 
$this->db->set('name', 'hoge')
$sql = $this->db->get_compiled_insert('table');
// $sql = INSERT INTO table (name) VALUES ('hoge');

SQLを返り値で受け取れるようになりました。
サブクエリとかを作るときに便利そうですね。(サブクエリ使うレベルになるとSQL直書きのが圧倒的に楽ですけどね。。。)
使い方は今まで通りで、最後のget()をget_compiled_select()に変更するだけです。

第一引数がテーブル名
第二引数がSQL発行後に条件をキャッシュするかどうかです。

$this->db->where('field01', 'hogehoge');
$this->db->limit(10, 20);
$sql01 = $this->db->get_compiled_select('table02', FALSE);
// $sql01 = SELECT * FROM `table01` WHERE `field01` = 'hogehoge' LIMIT 20, 10
 
$sql02 = $this->db->get_compiled_select('table02');
// $sql02 = SELECT * FROM `table02` WHERE `field01` = 'hogehoge' LIMIT 20, 10

上の例のように第二引数にFALSEを指定すると条件を削除しないで引き継ぐことができるようです。

group_start()、group_end() {#group_startgroup_end}

$this->db->group_start();
$this->db->where('id', 'hogehoge');
$this->db->or_where('mail', 'hoge@lalcs.com');
$this->db->group_end();
$this->db->where('password', 'test');
$sql = $this->db->get_compiled_select('user');
// $sql = SELECT * FROM `users` WHERE ( `id` = 'hogehoge' OR `mail` = 'hoge@lalcs.com' ) AND `password` = 'test'

なんとカッコ付きのSQLが発行できるようになったんです。
上の例だとログイン処理でユーザーが入力したID又はメールアドレス、パスワードが正しいかどうかを調べる場合を想定したSQLです。
SQLで括弧付きはかなりの頻度で使っているので個人的には最も嬉しい機能でした。

// or_group_start()
$this->db->group_start();
$this->db->where('id', 'hogehoge');
$this->db->or_where('mail', 'hoge@lalcs.com');
$this->db->group_end();
$this->db->where('password', 'test');
$this->db->or_group_start();
$this->db->where('name', 'hoge');
$this->db->where('name', 'gege');
$this->db->group_end();
$sql = $this->db->get_compiled_select('users');
// $sql = SELECT * FROM `users` WHERE ( `id` = 'hogehoge' OR `mail` = 'hoge@lalcs.com' ) AND `password` = 'test' OR ( `name` = 'hoge' AND `name` = 'gege' )
 
// not_group_start()
$this->db->group_start();
$this->db->where('id', 'hogehoge');
$this->db->or_where('mail', 'hoge@lalcs.com');
$this->db->group_end();
$this->db->where('password', 'test');
$this->db->not_group_start();
$this->db->where('name', 'hoge');
$this->db->where('name', 'gege');
$this->db->group_end();
$sql = $this->db->get_compiled_select('users');
// $sql = SELECT * FROM `users` WHERE ( `id` = 'hogehoge' OR `mail` = 'hoge@lalcs.com' ) AND `password` = 'test' AND NOT ( `name` = 'hoge' AND `name` = 'gege' )
 
// or_not_group_start()
$this->db->group_start();
$this->db->where('id', 'hogehoge');
$this->db->or_where('mail', 'hoge@lalcs.com');
$this->db->group_end();
$this->db->where('password', 'test');
$this->db->or_not_group_start();
$this->db->where('name', 'hoge');
$this->db->where('name', 'gege');
$this->db->group_end();
$sql = $this->db->get_compiled_select('users');
// $sql = SELECT * FROM `users` WHERE ( `id` = 'hogehoge' OR `mail` = 'hoge@lalcs.com' ) AND `password` = 'test' OR NOT ( `name` = 'hoge' AND `name` = 'gege' )

他にも、or_group_start()、not_group_start()、or_not_group_start()があります。
他にも、replace()など、細かいもの機能は追加されていますが使い方はこれまで通りで使えるため省略します。

Profile

Kazuki Hayashi

I'm a full stack engineer.
I love programming and alcohol.