フレームワークを使うには簡単すぎる、かといってPDOを使ってガリガリ書くのは面倒。
そんな時に役立つライブラリが「idiorm」です。(なんて読むんでしょうか?)
GitHubで公開しています。
https://github.com/j4mie/idiorm
ドキュメントはこちら。
http://idiorm.readthedocs.io/en/latest/index.html
インストール
インストールって程のことは無くて、上記GitHubからidiorm.phpをダウンロードするだけです。
簡単な使い方
まずは、コードを。
require_once 'idiorm.php';
// SQLiteのデータベースに接続
ORM::configure('sqlite:./schedule.db');
// PDOのエラーで例外を発生させるように
ORM::configure('error_mode', PDO::ERRMODE_EXCEPTION);
// SQLのログ使う。普段は使わない。
// ORM::configure('logging', true);
// scheduleテーブルからowner=satoのデータを取得し
// dateとtimeの昇順で並べ替える
$schedule = ORM::for_table('schedule')
->where('owner', 'sato')
->order_by_asc('date')
->order_by_asc('time')
->find_many();
ORM::configureでデータベースへの接続を書く。
基本的にPDOのdsnを書くことになります。MySQLだともうちょっと複雑です。<?php ORM::configure([ 'connection_string' => 'mysql:host=localhost;dbname=my_database', 'username' => 'database_user', 'password' => 'top_secret' ]);のように書きます。
ORM::for_table('テーブル名')と使うテーブルを指定する。- メソッドチェーンで
whereなどを指定する。 find_many、find_oneなどで複数取得するか、一件だけなのかを指定する。- 複数取得の場合は、$schedule にはオブジェクトの配列が入ってくる。
$schedule[0]['time']などと参照する。
もうちょっと突っ込んだ使い方
- レコードの作成
$data = [ 'owner' => 'sato', 'title' => 'オリンピック開会式', 'date' => '2020/07/20', 'time' => '19:00:00' ]; $schedule = ORM::for_table('schedule')->create() ->set($data) ->save(); // 挿入されたレコードのidを取りたい場合 $id = $schedule->id(); - レコードの更新
$data = [ 'id' => 12, 'owner' => 'sato', 'title' => 'オリンピック開会式(NHK)', 'date' => '2020/07/20', 'time' => '19:30:00' ]; // find_one([PRIMARY KEY のフィールドの値])でレコードを指定して取得できる。 ORM::for_table('schedule')->find_one($data['id']) ->set($data) ->save(); - キャッシュ
有効にしておくと、同じSELECTの場合、メモリ上にキャッシュされます。ORM::configure('caching', true); ORM::configure('caching_auto_clear', true);caching_auto_clearはキャッシュの自動クリアなので、trueにしておくのが良いでしょう。 - ログ
デバッグするのにログは欠かせないですね。// ログを有効にする ORM::configure('logging', true); /* 何かクエリーを実行する */ // 全てのログを出力する。 ORM::get_query_log(); // 最後のログを出力する ORM::get_last_query();
もっといろいろ出来ますが、詳しくは公式ドキュメントを調べましょう。英語ですけど。
!!!注意点!!!
複合キーに対応していません。PRIMARY KEYは一つのフィールドである必要があります。
複合キーのようなものを作るなら、idフィールドをAUTOINCREMENTのフィールドにして、UNIQUE制約を複合フィールドで作るのがいいですね。