勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

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

https://qiita.com/naga3/items/87fef230ac86aeec1eea

https://qiita.com/nagahama/items/71e92f117e6353295558

 - PHP データベース

  関連記事

MySQLのバックアップファイルを簡単に作成できるライブラリ「myphp-backup」の利用方法

MySQLのバックアップを取る際にadminerとかから手動で対応するのではなく ...