CodeIgniter

CodeIgniterのActiveRecord ヘルパーメソッド早見表

ActiveRecord(アクティブ・レコード)とは?

Active Record - Wikipedia

Active Recordはデータベースからデータを読み出すためのアプローチである。
データベーステーブルあるいはビューの1行が1つのクラスにラップされ、オブジェクトのインスタンスがそのデータベースの1つの行に結合される。
このクラスはデータベースアクセスのカプセル化も行う。
オブジェクトの生成後は、保存メソッドで新しい行がデータベースに追加される。
オブジェクトが更新されると、データベースの対応する行もまた更新される。
ラッパークラスはテーブルあるいはビューの各カラムに対するアクセサメソッドを実装するが、それ以外の振る舞い(MVCのモデルが担当すべきロジック)も記述することができる。
一方でその性質上、複雑な設計のデータベースとは相性が悪い。

CodeIgniterのActiveRecord

SQLを書いてデータベースを操作したい場合は、CodeIgniter CRUDを参照。

(参考)


読み込み Read

get() … SELECTを実行

単独で使うとテーブルの全レコードを取得する。

$query = $this->db->get('mytable');
// SELECT * FROM mytable

limitとoffsetを指定できる。

$query = $this->db->get('mytable', 10, 20);
// SELECT * FROM mytable LIMIT 20, 10 (MySQLの場合)

select() … カラムを指定

$this->db->select('title, content, date');
$query = $this->db->get('mytable');
// SELECT title, content, date FROM mytable

select_max() … 最大値を取得 SELECT MAX(field)

$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_min() … 最小値を取得 SELECT MIN(field)

select_max()と同様。

$this->db->select_min('age');
$query = $this->db->get('members');
// SELECT MIN(age) as age FROM members

from() … テーブルを指定

$this->db->select('title, content, date');
$this->db->from('mytable');
$query = $this->db->get();
// SELECT title, content, date FROM mytable

テーブルの指定はget()メソッドの第1引数で指定することも可能(その方が冗長でない?)。

where() … 条件句を指定

where()メソッドの引数

  1. 第1引数 … カラム名
  2. 第2引数 … (カラム名にバインドする=結び付ける)値
  3. 第3引数 … エスケープの有無(FALSEを指定するとエスケープしない)
$this->db->where('user', $name, FALSE);

条件句の組み立て方には、4つの方法がある。

1. キー/値の組合せで指定

$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'

2. 演算子を指定

$this->db->where('name !=', $name);
$this->db->where('id <', $id); 
// WHERE name != 'Joe' AND id < 45

3. 連想配列で一度に複数の条件を指定

$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'

4. 自由に指定する

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() … LIKE句を生成

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()メソッドを複数回呼び出す方法の方が扱いやすいかも?

問合せ結果の処理

query() … クエリーの実行

$sql = "SELECT * FROM mytable WHERE user = ?";
$param = array($user);
$query = $this->db->query($sql, $param);

result_array() … クエリーの結果を配列で返す

$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>"; 
}

num_rows() … クエリで返されたレコード数を取得

$this->db->select('title, name, date');
$query = $this->db->get('mytable');
echo $query->num_rows();
// 3 のような整数が出力される(取得されたレコード数は3件だった)

row_array() … クエリーの結果を1行だけ返す

$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);

first_row()、last_row()、next_row()、previous_row() … 結果セットの移動(ページング)

$row = $query->first_row('array')
$row = $query->last_row('array')
$row = $query->next_row('array')
$row = $query->previous_row('array')

引数に"array"と指定しなければ、デフォルトでは、これらのメソッドはオブジェクトを返す。

count_all() … テーブルの全レコード数を取得

echo $this->db->count_all('my_table');
// 25 のような整数が出力される(全レコード数は25件だった)

count_all_results() … 条件を指定してレコード数を取得

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件だった)

書き込み Write

insert() … データの挿入

$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')

insert_id() … 挿入されたデータのID番号を取得

echo $this->db->insert_id();
// 25 のような整数が出力される(挿入されたレコードは25件目だった)

update() … データの更新

update($table = '', $set = NULL, $where = NULL, $limit = NULL)
  1. 第1引数: テーブル名を指定
  2. 第2引数: 更新するデータを連想配列で指定
     → set()メソッドで指定してもOK
  3. 第3引数: 更新条件(WHERE句)を連想配列で指定
     → where()メソッドで指定してもOK
  4. 第4引数: 更新行数の最大値を指定
     → limit()メソッドで指定してもOK
$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

delete() … データの削除

  1. 第1引数: テーブル名を指定
  2. 第2引数: WHERE句を指定
     → where()メソッドで指定してもOK
$table = 'mytable';
$where['id'] = $id;
$this->db->delete($table, $where);
// DELETE FROM mytable 
// WHERE id = $id

affected_rows() … 処理されたレコード数を取得

書き込みタイプのクエリー (insert、updateなど) が実行されたとき、処理された行の数を取得する。

echo $this->db->affected_rows();
// 3 のような整数が出力される(処理されたレコード数は3件だった)

truncate() … テーブルの全データを削除

$table = 'mytable';
$this->db->truncate($table);
// TRUNCATE mytable

後始末

free_result() … メモリの解放

$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 はもう利用できなくなる

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-06-11 (土) 14:21:12