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とかから手動で対応するのではなく ...