CodeIgniterのActiveRecord ヘルパーメソッド早見表
Active Recordはデータベースからデータを読み出すためのアプローチである。
データベーステーブルあるいはビューの1行が1つのクラスにラップされ、オブジェクトのインスタンスがそのデータベースの1つの行に結合される。
このクラスはデータベースアクセスのカプセル化も行う。
オブジェクトの生成後は、保存メソッドで新しい行がデータベースに追加される。
オブジェクトが更新されると、データベースの対応する行もまた更新される。
ラッパークラスはテーブルあるいはビューの各カラムに対するアクセサメソッドを実装するが、それ以外の振る舞い(MVCのモデルが担当すべきロジック)も記述することができる。
一方でその性質上、複雑な設計のデータベースとは相性が悪い。
SQLを書いてデータベースを操作したい場合は、CodeIgniter CRUDを参照。
(参考)
単独で使うとテーブルの全レコードを取得する。
$query = $this->db->get('mytable'); // SELECT * FROM mytable
limitとoffsetを指定できる。
$query = $this->db->get('mytable', 10, 20); // SELECT * FROM mytable LIMIT 20, 10 (MySQLの場合)
$this->db->select('title, content, date'); $query = $this->db->get('mytable'); // SELECT title, content, date FROM mytable
$this->db->select_max('age'); $query = $this->db->get('members'); // SELECT MAX(age) as age FROM members
第2引数で、カラム名の指定もできる。
$this->db->select_max('age', 'member_age'); $query = $this->db->get('members'); // 次を生成: SELECT MAX(age) as member_age FROM members
select_max()と同様。
$this->db->select_min('age'); $query = $this->db->get('members'); // SELECT MIN(age) as age FROM members
$this->db->select('title, content, date'); $this->db->from('mytable'); $query = $this->db->get(); // SELECT title, content, date FROM mytable
テーブルの指定はget()メソッドの第1引数で指定することも可能(その方が冗長でない?)。
where()メソッドの引数
$this->db->where('user', $name, FALSE);
条件句の組み立て方には、4つの方法がある。
$this->db->where('name', $name); // WHERE name = 'Joe'
where()メソッドを複数回呼ぶと、ANDで連結される。
$this->db->where('name', $name); $this->db->where('title', $title); $this->db->where('status', $status); // WHERE name = 'Joe' AND title = 'boss' AND status = 'active'
$this->db->where('name !=', $name); $this->db->where('id <', $id); // WHERE name != 'Joe' AND id < 45
$array = array('name' => $name, 'title' => $title, 'status' => $status); $this->db->where($array); // WHERE name = 'Joe' AND title = 'boss' AND status = 'active'
$array = array('name !=' => $name, 'id <' => $id, 'date >' => $date); $this->db->where($array); // WHERE name != 'Joe' AND id < 45 AND date > '1999-12-31'
WHERE句の中身を生のSQLで指定することもできる。
$where = "name='Joe' AND status='boss' OR status='active'"; $this->db->where($where); // WHERE name='Joe' AND status='boss' OR status='active'
SQLを直に指定できるので、細かい条件があったら、この方法でぶち込めばOK?
like()メソッドに渡されるすべての値は自動でエスケープされる。
$this->db->like('title', 'match'); // WHERE title LIKE '%match%'
$this->db->like('title', 'match'); $this->db->like('body', 'match'); // WHERE title LIKE '%match%' AND body LIKE '%match%'
$this->db->like('title', 'match', 'before'); // WHERE title LIKE '%match'
$this->db->like('title', 'match', 'after'); // WHERE title LIKE 'match%'
$this->db->like('title', 'match', 'both'); // WHERE title LIKE '%match%' // $this->db->like('title', 'match'); と同じ動作
$array = array('title' => $match, 'page1' => $match, 'page2' => $match); $this->db->like($array); // WHERE title LIKE '%match%' AND page1 LIKE '%match%' AND page2 LIKE '%match%'
デバッグ時の手間を考えると、like()メソッドを複数回呼び出す方法の方が扱いやすいかも?
$sql = "SELECT * FROM mytable WHERE user = ?"; $param = array($user); $query = $this->db->query($sql, $param);
$this->db->select('title, name, date'); $this->db->from('mytable'); $query = $this->db->get(); // SELECT title, content, date FROM mytable $result = $query->result_array(); foreach ($result as $row) { $title = $row['title']; $name = $row['name']; $date = $row['date']; echo "title=".$title." / name=".$name." / date=".$date."<br>"; }
$this->db->select('title, name, date'); $query = $this->db->get('mytable'); echo $query->num_rows(); // 3 のような整数が出力される(取得されたレコード数は3件だった)
$this->db->select('title, name, date'); $this->db->where('name', 'Joe'); $this->db->from('mytable'); $query = $this->db->get(); // SELECT title, name, date FROM mytable WHERE name = 'Joe' if ($query->num_rows() > 0) { $row = $query->row_array(); echo $row['title']; echo $row['name']; echo $row['date']; }
$row = $query->row_array(5);
$row = $query->first_row('array')
$row = $query->last_row('array')
$row = $query->next_row('array')
$row = $query->previous_row('array')
引数に"array"と指定しなければ、デフォルトでは、これらのメソッドはオブジェクトを返す。
echo $this->db->count_all('my_table'); // 25 のような整数が出力される(全レコード数は25件だった)
echo $this->db->count_all_results('my_table'); // 25 のような整数が出力される(全レコード数は25件だった)
$this->db->like('title', '重要'); $this->db->from('my_table'); echo $this->db->count_all_results(); // 17 のような整数が出力される。(条件に合うレコード数は17件だった)
$data['title'] = 'My title'; $data['name'] = 'My Name'; $data['date'] = 'My date'; $this->db->insert('mytable', $data); // INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date')
echo $this->db->insert_id(); // 25 のような整数が出力される(挿入されたレコードは25件目だった)
update($table = '', $set = NULL, $where = NULL, $limit = NULL)
$table = 'mytable'; $data['title'] = $title; $data['name'] = $name; $data['date'] = $date; $where['id'] = $id; $this->db->update($table, $data, $where); // UPDATE mytable // SET title = '{$title}', name = '{$name}', date = '{$date}' // WHERE id = $id
$table = 'mytable'; $where['id'] = $id; $this->db->delete($table, $where); // DELETE FROM mytable // WHERE id = $id
書き込みタイプのクエリー (insert、updateなど) が実行されたとき、処理された行の数を取得する。
echo $this->db->affected_rows(); // 3 のような整数が出力される(処理されたレコード数は3件だった)
$table = 'mytable'; $this->db->truncate($table); // TRUNCATE mytable
$query = $this->db->query('SELECT title FROM my_table'); foreach ($query->result() as $row) { echo $row->title; } $query->free_result(); // 結果オブジェクトの $query はもう利用できなくなる $query2 = $this->db->query('SELECT name FROM some_table'); $row = $query2->row(); echo $row->name; $query2->free_result(); // 結果オブジェクトの $query2 はもう利用できなくなる