フレームワークを使うには簡単すぎる、かといって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
制約を複合フィールドで作るのがいいですね。