PHPでデータベースを取り扱いやすくなるORMライブラリ「idiorm」の利用方法
Codeigniterでデータベースを取り扱う際にクエリビルダクラスを用いて可読性の高いソースコードを記述できるが、バニラPHPでも同じようなことをしたい。調べてみると「j4mie / idiorm」というORMライブラリがシンプルで良さそう。以下に利用方法のメモ。
目次
j4mie / idiorm
GitHub
https://github.com/j4mie/idiorm
リファレンス
https://idiorm.readthedocs.io/en/latest/index.html
インストール
こちらのページからidiorm.phpをダウンロードし、適当なディレクトリにアップロードする。
データベース構造
以下のようなテーブルを用意した。
mysql> SHOW COLUMNS FROM `test_table`; +------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | id | int | NO | PRI | NULL | auto_increment | | name | varchar(255) | NO | | NULL | | | score | int | NO | | NULL | | | regist_ymd | datetime | NO | | NULL | | +------------+--------------+------+-----+---------+----------------+
利用方法
データベース接続
//MySQL接続 ORM::configure('mysql:host=【ホスト】;dbname=【データベース名】'); ORM::configure('username', '【ユーザー】'); ORM::configure('password', '【パスワード】');
キャッシュ及びログ設定
//キャッシュ設定 ORM::configure('caching', true); ORM::configure('caching_auto_clear', true); //ログ設定 ORM::configure('logging', true);
INSERT
$now = new DateTime(); $data = array( 'name' => '鈴木', 'score' => 61, 'regist_ymd' => $now->format('Y-m-d H:i:s') ); $query = ORM::for_table('test_table')->create()->set($data)->save(); $sqls = ORM::get_query_log(); var_dump($sqls); //INSERT INTO `test_table` (`name`, `score`, `regist_ymd`) VALUES ('鈴木', '61', '2024-05-11 12:41:51')
UPDATE
$data = array( 'id' => 6, 'score' => 77, ); $query = ORM::for_table('test_table')->find_one($data['id'])->set($data)->save(); $sqls = ORM::get_query_log(); var_dump($sqls); /* array(2) { [0]=> string(51) "SELECT * FROM `test_table` WHERE `id` = '6' LIMIT 1" [1]=> string(67) "UPDATE `test_table` SET `id` = '6', `score` = '77' WHERE `id` = '6'" } */
SELECT
$data = ORM::for_table('test_table')->find_many(); foreach( (array)$data as $val ){ var_dump($val->id); var_dump($val->name); var_dump($val->score); var_dump($val->regist_ymd); } $sqls = ORM::get_query_log(); var_dump($sqls); //SELECT * FROM `test_table`
DELETE
$data = array( 'id' => 6, ); $query = ORM::for_table('test_table')->find_one($data['id'])->delete(); $sqls = ORM::get_query_log(); var_dump($sqls); /* array(2) { [0]=> string(51) "SELECT * FROM `test_table` WHERE `id` = '6' LIMIT 1" [1]=> string(41) "DELETE FROM `test_table` WHERE `id` = '6'" } */
素のSQL文を実行したい場合
$sql = ' SELECT * FROM test_table WHERE score > 30 '; $query = ORM::for_table('test_table')->raw_query($sql)->find_many(); foreach( (array)$query as $val ){ var_dump($val->id); var_dump($val->name); var_dump($val->score); var_dump($val->regist_ymd); } $sqls = ORM::get_query_log(); var_dump($sqls); /* array(1) { [0]=> string(52) " SELECT * FROM test_table WHERE score > 30 " } */
ORMについて
ORM(Object-Relational Mapping)とは
ウィキペディアによると以下の通り。
データベースとオブジェクト指向プログラミング言語の間の非互換なデータを変換するプログラミング技法である。
ざっくりと「SQLを直接書くことなくオブジェクトのメソッドでDB操作ができる」手法と覚えておいてよさそう。
ORMのメリット
以下がメリットで特に後者の方が大きいように思う。
- SQL文を書くことなくデータベースを操作できる
- MySQL→SQLServer等にデータベースが変わってもアプリケーション側に影響が無い
所感
慣れるまで若干時間がかかりそうなものの簡潔に書けるのが良い。
SELECT時はややこしいSQL文を書くケースがたまにあるが、UPDATE / INSERT / DELETE時はほとんど定型文になるので、そういった場合にidiorm形式で書くことになりそう。
参考サイト
https://codeclub965.com/?p=1611
関連記事
-
MySQLのバックアップファイルを簡単に作成できるライブラリ「myphp-backup」の利用方法
MySQLのバックアップを取る際にadminerとかから手動で対応するのではなく ...