データベース ライブラリ
Ziu 付属のデータベースライブラリです。内部ではPHPのPDOライブラリを用いて、データベース操作を行う機能を提供します。
このデータベースライブラリは、SQLナビゲータ と称するチェーンメソッド形式に関数をつなぎ合わせてSQLライクにデータを操作することができます。
設定
データベースライブラリを利用するための設定を行ないます。
設定からデータ取得までの簡単な流れを示します。
単体で利用の設定方法
本データベースライブラリは、単体で使用することができます。
$config = array(
'dsn' => 'mysql:host=localhost;dbname=sample_pro',
'user' => 'sample_user',
'pass' => '123456',
'pooling' => FALSE,
);
$db = new Database($config);
$list = $db->fetch($db->select()->from('sample_table'))->all();
Ziu で利用の設定方法
Ziu での利用では、モデルスーパークラスを用いでインスタンスが作成されます。
設定の記述はデータベース設定で行ない、本ライブラリをモデルクラスで使用します。
データベース設定
_conf/db.php
に 接続名 に合わせ接続情報を指定します。以下は接続名が production の場合。
'connection' => array(
'production' => array(
'dsn' => 'mysql:host=localhost;dbname=sample_pro',
'user' => 'sample_user',
'pass' => '123456',
'pooling' => FALSE,
),
),
モデルクラス
テーブルに合わせたモデルクラス _model/sample_table.php
を用意します。
public function getAll()
{
return $this->fetch($this->select()->from('sample_table'))->all();
}
ロジッククラス
作成したモデルオブジェクトから getAll()
メソッドを利用してデータを取得します。
$list = model('sample_table')->getAll();
設定項目
項目 | 型 | 初期値 | 説明 |
---|---|---|---|
dsn | string | なし | PDOで利用できるDSNを指定します |
user | string | なし | データベースの接続ユーザー名を指定します |
pass | string | なし | データベースの接続パスワードを指定します |
charset | string | utf8 | データベースの接続文字エンコードを指定します |
pooling | boolean | FALSE | PDOプーリング機能の利用可否を指定します |
autocommit | boolean | TRUE | PDO自動コミット機能の利用可否を指定します |
reporting | string | exception | PDOエラーリポートモード (silent,warning,exception) を指定します |
使い方
Ziu のモデルクラスでデータベースライブラリの利用方法として、いくつかのサンプルを示します。
レコードを取得
シンプルなデータ取得
SQLナビゲータ により、チェーンメソッドを用いてSQLのような形で記述することができます。
$sn = $this->select()->from('member')->where(array('member_id', $id)); // end of $sn
$data = $this->fetch($sn)->row();
SQL式の指定
SQL式を指定して、演算したした結果をWHERE句に指定することができます。
->where(array('age > age + 1'))
サブクエリを利用
WHERE句、FROM句、JOIN句にサブクエリとして SQLナビゲータ を記述することができます。
WHERE句の場合、条件の値指定に SQLナビゲータ をネストします。
->where(
array('id', 'in', $this->select('member_id')->from('team')->where(array('team_id', 2)))
)
FROM句、JOIN句では、テーブル指定に配列 array(<SQLナビゲータ>, 'エイリアス名')
を用いて指定します。
->from(array($this->select()->from('member')->where(array('gender_id', 1)), 'm'))
レコードを登録
シンプルなインサート
テーブルのカラムに合わせた連想配列を指定することで、レコードを登録することができます。
$data = array(
'name' => '佐藤 一郎',
'age' => '20',
'birthday' => '1992-01-19',
'gender_id' => 1,
'inserted_at' => date('Y-m-d H:i:s'),
);
$sn = parent::insert('member')->values($data);
$ret = $this->execute($sn);
複数レコードをインサート
values()
メソッドを繰り返し指定して複数レコードのインサートができます。(MySQLのみ)
$sn = parent::insert('member')->values($data1)
->values($data2)
; // end of $sn
$ret = $this->execute($sn);
2次元配列での指定も可能です。
$sn = parent::insert('member')->values(array($data1, $data2));
$ret = $this->execute($sn);
SQL式の指定
SQL式を指定して、演算したした結果をインサートすることができます。(アップデートでも同様に利用可)
$data['code_num'] = array('code_num + 1'); // or array('code_num', '+' ,'1');
セレクトインサート
セレクト文を用いてインサートすることで、取得したレコードを登録することができます。
$sn = parent::insert('sample_user')->select(
$this->select('id', 'name')->from('member')->where(array('class_id', 1))
); // end of $sn
レコードを更新
アップデート
テーブルのカラムに合わせた連想配列を指定することで、WHERE句に任意の条件を用いてレコードを更新することができます。
$data = array(
'name' => '佐藤 一郎',
'age' => '20',
'birthday' => '1992-01-19',
'gender_id' => 1,
'inserted_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
);
$sn = parent::update('member')->set($data)->where(array('id', 3));
$this->execute($sn);
レコードを削除
デリート
WHERE句などに任意の条件を用いて、レコードを削除することができます。
$sn = parent::delete('member')->where(array('id', '>', 7));
$this->execute($sn);
直接SQLを実行
取得系
query()
メソッドを実行した後、all()
、row()
、one()
メソッドでレコードを取得します。
$this->query('select * from member')->all();
更新系
query()
メソッドを実行するのみです。
$this->query('update member set age = 30 where id = 2');
メソッドリファレンス
データベースライブラリのメソッドリファレンスです。
- 共通メソッド
- config() : 初期設定
- connect() : データベース接続を実行
- fetch() : 取得系 SQLナビゲータ を実行
- execute() : 更新系 SQLナビゲータ を実行
- query() : 直接SQLを実行
- all() : 複数レコードを取得
- row() : 単一レコードを取得
- one() : 1つのデータを取得
- quote() : SQL用クオートの処理
- last_query() : 最後の実行SQLを取得
- real_query() : SQLナビゲータ のSQLを取得
- last_insert_id() : 最後のインサートIDを取得
- affected() : 影響した行数を取得
- トランザクション系メソッド
- begin() : トランザクションを開始
- commit() : コミットを実行
- rollback() : ロールバックを実行
- transaction() : トランザクション判定
- autocommit() : 自動コミットの設定
- SELECT系メソッド
- WHERE系メソッド
- INSERT系メソッド
- UPDATE系メソッド
- update() : UPDATE オブジェクトの作成
- set() : SET句を指定
- join(), on(), using() : JOIN、ON、USING句を指定
- where(), and_(), or_(), paren() : WHERE、AND、OR、丸括弧(パーレン)を指定
- DELETE系メソッド
- delete() : DELETE オブジェクトの作成
- where(), and_(), or_(), paren() : WHERE、AND、OR、丸括弧(パーレン)を指定
共通メソッド
config($config = NULL)
データベースライブラリの初期設定をします。
戻り値
型 : mixed
$config
に指定する内容で戻り値が変わります。
引数値
項目 | 型 | 内容 |
---|---|---|
$config | mixed | 設定を配列で指定 |
$config
に設定名を文字列で指定した場合は現在の設定値を取得できます。未指定の場合は全ての設定値を配列で取得します。
$config
に指定する設定項目については、設定を参照して下さい。
connect()
conifg()
による設定に応じたデータベース接続を実行します。
データベース接続オブジェクトはクラス内部で保持され、SQLナビゲータ オブジェクトで使用されます。
戻り値
型 : object Database
データベース接続オブジェクト
引数値
なし
fetch(Database_Query $builder)
取得系の SQLナビゲータ オブジェクトを実行します。
戻り値
型 : object Database
引数値
項目 | 型 | 内容 |
---|---|---|
$builder | object | 取得系の SQLナビゲータ オブジェクト |
例) $this->fetch($this->select()->from('member'))->all();
execute(Database_Query $builder)
主に更新系の SQLナビゲータ オブジェクトを実行します。
戻り値
型 : boolean
引数値
項目 | 型 | 内容 |
---|---|---|
$builder | object | SQLナビゲータ オブジェクト |
例) $this->execute(parent::insert(array('name' => 'sample')));
query($query)
直接SQLを実行します。
MySQLの set
や show
コマンドなども実行することができます。
戻り値
型 : object Database
引数値
項目 | 型 | 内容 |
---|---|---|
$query | string | SQLクエリ |
例) $this->query('select * from member where age = 20')->all();
all($object = FALSE)
複数のレコードを配列で取得します。データが存在しない場合は空の配列を返します。
戻り値
型 : array
$object
の指定がある場合、そのオブジェクトにバインドされます。
引数値
項目 | 型 | 内容 |
---|---|---|
$object | mixed | クラス名、又はオブジェクト |
例) $this->fetch($this->select()->from('member'))->all('Member');
row($object = FALSE)
1件のレコードを配列で取得します。データが存在しない場合は空の配列を返します。
戻り値
型 : mixed
デフォルトは配列で返します。$object
の指定がある場合、バインドされたオブジェクトを返します。
引数値
項目 | 型 | 内容 |
---|---|---|
$object | mixed | クラス名、又はオブジェクト |
例) $this->fetch($this->select()->from('member')->where('id' => $id))->row('Member');
one($num = 0)
1つのデータを取得します。データが存在しない場合は空文字を返します。
戻り値
型 : string
引数値
項目 | 型 | 内容 |
---|---|---|
$num | integer | カラム番号 |
例) $this->fetch($this->select('count(id)')->from('member'))->one();
quote($val)
SQL向けにクオートした値を取得します。
戻り値
型 : string
引数値
項目 | 型 | 内容 |
---|---|---|
$val | string | SQLの値 |
例) $sql = ' where id = ' . $this->quote($id);
last_query()
最後に実行されたSQLを取得します。
戻り値
型 : string
引数値
なし
例) $this->last_query();
real_query(Database_Query $builder)
SQLナビゲータ により生成されたSQLを取得します。
戻り値
型 : string
引数値
項目 | 型 | 内容 |
---|---|---|
$builder | object | SQLナビゲータ オブジェクト |
例) $this->real_query($this->select()->from('member'));
last_insert_id($name = NULL)
最後にインサートしたID(シーケンスID)を取得します。(MySQLのみ)
戻り値
型 : integer
引数値
項目 | 型 | 内容 |
---|---|---|
$name | string | シーケンスカラム名 |
$name
が未指定の場合は自動的にシーケンスIDの取得を試みます。
例) $this->last_insert_id();
affected()
SQLにより影響した行数を取得します。取得系の場合は取得件数を返します。
戻り値
型 : integer
引数値
なし
例) $this->affected();
トランザクション系メソッド
begin()
データベース接続オブジェクトに対してトランザクションを開始します。
戻り値
型 : boolean
成功した場合に TRUE を、失敗した場合に FALSE を返します。
引数値
なし
例) $this->begin();
commit()
トランザクション中のデータベース操作をコミットします。
戻り値
型 : boolean
成功した場合に TRUE を、失敗した場合に FALSE を返します。
引数値
なし
例) $this->commit();
rollback()
トランザクション中のデータベース操作をロールバックします。
戻り値
型 : boolean
成功した場合に TRUE を、失敗した場合に FALSE を返します。
引数値
なし
例) $this->rollback();
transaction()
トランザクションが開始されているか判断します。
戻り値
型 : boolean
トランザクションが現在アクティブな場合に TRUE、 そうでないときに FALSE を返します。
引数値
なし
例) $this->transaction() && $this->rollback();
autocommit($bool = TRUE)
単一SQL文での自動コミットを設定します。
戻り値
型 : boolean
成功した場合に TRUE を、失敗した場合に FALSE を返します。
引数値
項目 | 型 | 内容 |
---|---|---|
$bool | boolean | TRUE、又は FALSE |
例) $this->autocommit(FALSE);
自動コミットの設定はconfig()
の設定でも指定できます。
初期値は TRUE 自動コミットON となっています。
SELECT系メソッド
select([$col, array($col, 'alias'), ...])
SELECT としての SQLナビゲータ オブジェクトを作成します。
戻り値
型 : object Database_Select
引数値
項目 | 型 | 内容 |
---|---|---|
$col | mixed | カラム名 |
$col
はカンマ区切りで複数指定できます。
配列 array($col, 'エイリアス名')
での指定も可能です。未指定 select()
の場合はアスタリスク select('*')
として扱われます
例) $this->select(array('name', 'member_na'))->from('member');
from($table[, array($table, 'alias')...])
FROM句を指定します。
戻り値
型 : object Database_Select
引数値
項目 | 型 | 内容 |
---|---|---|
$table | mixed | テーブル名 |
$table
はカンマ区切りで複数指定できます。
配列 array($table, 'エイリアス名')
での指定も可能です。複数のテーブル名を指定しクロスジョインができます。
例) $this->select()->from(array('member', 'm'), array('guest', 'g'))->where(array('m.guest_id = g.guest_id'));
join($table, $type = 'left')
JOIN句を指定します。
戻り値
型 : object Database_Select
引数値
項目 | 型 | 内容 |
---|---|---|
$table | mixed | テーブル名 |
$type | string | JOINタイプ |
$table
は、配列 array($table, 'エイリアス名')
での指定も可能です。
SQLナビゲータ のサブクエリを array(<SQLナビゲータ>, 'エイリアス名')
で指定することも可能です。
$type
には、left
、right
、inner
等を指定します。未指定時は left
として扱われます。
例) $this->select()->from('member')->join('gender')->using('gender_id');
on($condition[, $condition...])
ON句を指定します。
戻り値
型 : object Database_Select
引数値
項目 | 型 | 内容 |
---|---|---|
$condition | mixed | JOIN条件 |
$condition
は where() と同じ指定方法となります。
例) ->join('gender g')->on(array('g.gender_id = m.gender_id'), array('age >= 20'))
using($col[, $col...])
USING句を指定します。
戻り値
型 : object Database_Select
引数値
項目 | 型 | 内容 |
---|---|---|
$col | string | カラム名 |
カンマ区切りで複数指定可能です。
例) ->join('gender')->using('gender_id')
group($col[, $col...])
GROUP BY句を指定します。
戻り値
型 : object Database_Select
引数値
項目 | 型 | 内容 |
---|---|---|
$col | string | カラム名 |
カンマ区切りで複数指定可能です。
例) ->group('age')
having($condition[, $condition...])
HAVING句を指定します。
戻り値
型 : object Database_Select
引数値
項目 | 型 | 内容 |
---|---|---|
$condition | mixed | HAVING条件 |
$condition
は where() と同じ指定方法となります。
例) ->group('age')->having(array('gender_id', 1))
order($col[, array($col, 'direction')...])
ORDER BY句を指定します。
戻り値
型 : object Database_Select
引数値
項目 | 型 | 内容 |
---|---|---|
$col | mixed | カラム名 |
$col
は、配列 array($col, 'direction')
で順序を指定することができます。
例) ->order(array('id', 'desc')) 又は ->order('id desc')
limit($num)
LIMIT句を指定します。
戻り値
型 : object Database_Select
引数値
項目 | 型 | 内容 |
---|---|---|
$num | integer | リミット |
例) ->limit(10)->offset(0)
offset($num)
OFFSET句を指定します。
戻り値
型 : object Database_Select
引数値
項目 | 型 | 内容 |
---|---|---|
$num | integer | オフセット |
例) ->limit(10)->offset(0)
union($query)
UNION句を指定し、SELECT文を結合します。
戻り値
型 : object Database_Select
引数値
項目 | 型 | 内容 |
---|---|---|
$query | mixed | Database_Select オブジェクト 又は all を指定 |
例) ->union('all', $this->select()->from('member'))
WHERE系メソッド
where($condition[, $condition...])
WHERE句を指定します。
戻り値
型 : object Database_Where
引数値
項目 | 型 | 内容 |
---|---|---|
$condition | mixed | WHERE条件 |
条件の指定方法
条件指定は配列で行います。
論理演算子の and
、or
や丸括弧(パーレン) (
、)
は文字列/配列どちらでも指定可能です。
条件配列の指定種類には、1項指定/2項指定/3項指定があります。
項目 | 例 | SQL | 説明 |
---|---|---|---|
1項指定 | array('age > age + 1') |
age > age + 1 | SQL式を直接記述します |
2項指定 | array('age', 20) |
age = 20 | イコール比較となります |
3項指定 | array('age', '!=', 30) |
age != 30 | 任意の比較演算子を記述します |
比較条件
m.id = 4
→array('m.id', 4) 又は array('m.id', '=', 4)
m.id >= 4
→array('m.id', '>=', 4)
BETWEEN条件
m.birth between '2011-10-05' and '2012-10-15'
→array('m.birth', 'between', array('2011-10-05', '2012-10-15'))
IN条件
m.id not in (4, 5, 6)
→array('m.id', 'not in', array(4, 5, 6)) 又は array('m.id', 'not in', '(4, 5, 6)')
直接SQL条件
substring(name, -2) = 11
→array('substring(name, -2) = 11')
AND条件
m.age > 10 and m.age < 20
→->where(array('m.age', '>', 10), array('and'), array('m.age', '<', 20))
→->where(array('m.age', '>', 10), 'and', array('m.age', '<', 20))
→->where(array('m.age', '>', 10))->and_(array('m.age', '<', 20))
OR条件
m.age = 20 or m.age = 30
→->where(array('m.age', 20), array('or'), array('m.age', 30))
→->where(array('m.age', 20), 'or', array('m.age', 30))
→->where(array('m.age', 20))->or_(array('m.age', 30))
サブクエリ条件
m.id not in (select * from member where age < 20)
→array('m.id', 'not in', $this->select()->from('member')->where(array('age', '<', 20)))
and_($condition[, $condition...])
AND句を指定します。
戻り値
型 : object Database_Where
引数値
項目 | 型 | 内容 |
---|---|---|
$condition | mixed | AND条件 |
$condition
は where() と同じ指定方法となります。
例) ->and_(array('age', '>', 20))
or_($condition[, $condition...])
OR句を指定します。
戻り値
型 : object Database_Where
引数値
項目 | 型 | 内容 |
---|---|---|
$condition | mixed | OR条件 |
$condition
は where() と同じ指定方法となります。
例) ->or_(array('age', '>', 20))
paren($condition[, $condition...])
丸括弧(パーレン)を指定します。
戻り値
型 : object Database_Where
引数値
項目 | 型 | 内容 |
---|---|---|
$condition | mixed | WHERE条件 |
第1引数に and
又は or
を指定する事で、丸括弧(パーレン)指定を連結する論理演算子となります。
$condition
は where() と同じ指定方法となります。
例) ->paren('or', array('age', '>', 20)) // or (age > 20)
INSERT系メソッド
insert($table, $cols = NULL)
INSERT としての SQLナビゲータ オブジェクトを作成します。
戻り値
型 : object Database_Insert
引数値
項目 | 型 | 内容 |
---|---|---|
$table | string | テーブル名 |
$cols | array | カラム名 |
$cols
を省略した場合、values()
メソッドの連想配列のキーが使用されます。
例) parent::insert('member')->values(array('name' => 'Shue'));
values(array $vals)
VALUES句を指定します。
戻り値
型 : object Database_Insert
引数値
項目 | 型 | 内容 |
---|---|---|
$vals | array | データ |
本メソッドを複数回コールしたり、2次元配列で複数レコードを指定することでバルクインサートをすることができます。
例) parent::insert('member')->values(array(array('name' => 'Tom'), array('name' => 'Joe')))
select(Database_Select $query)
INTO SELECT句を指定します。
戻り値
型 : object Database_Insert
引数値
項目 | 型 | 内容 |
---|---|---|
$vals | array | SQLナビゲータ オブジェクト |
例) parent::insert('member')->select($this->select('name')->from('guest'));
UPDATE系メソッド
update($table)
UPDATE としての SQLナビゲータ オブジェクトを作成します。
戻り値
型 : object Database_Update
引数値
項目 | 型 | 内容 |
---|---|---|
$table | string | テーブル名 |
例) parent::update('member')->set(array('name', 'Bylon'))->where(array('id', 2));
set(array $sets)
SET句を指定します。
戻り値
型 : object Database_Update
引数値
項目 | 型 | 内容 |
---|---|---|
$sets | array | データ |
例) parent::update('member')->set(array('name', 'Bylon'))->where(array('id', 2));
join(), on(), using()
JOIN、ON、USING句を指定します。
戻り値
型 : object Database_Update
引数値
これらはSELECT系メソッド join()、on()、using() と同じ指定方法となります。
where(), and_(), or_(), paren()
WHERE、AND、OR、丸括弧(パーレン)を指定します。
戻り値
型 : object Database_Update
引数値
これらはWHERE系メソッド where()、and_()、or_()、paren() と同じ指定方法となります。
DELETE系メソッド
delete($table)
DELETE としての SQLナビゲータ オブジェクトを作成します。
戻り値
型 : object Database_Delete
引数値
項目 | 型 | 内容 |
---|---|---|
$table | string | テーブル名 |
例) parent::delete('member')->where(array('id', 10));
where(), and_(), or_(), paren()
WHERE、AND、OR、丸括弧(パーレン)を指定します。
戻り値
型 : object Database_Delete