勉強したことのメモ

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 データベース

  関連記事

PHPのHTTPクライアント用ライブラリ「Guzzle」の利用方法
PHPのHTTPクライアント用ライブラリ「Guzzle」の利用方法

以前に「Requests for PHP」を試したが、似たようなライブラリで「G ...

Push.jsを用いてプッシュ通知を実装&Web Audio APIで通知音も鳴らす方法
Push.jsを用いてプッシュ通知を実装&Web Audio APIで通知音も鳴らす方法

プッシュ通知(デスクトップ通知)を実装してみたい。また、通知の際は分かりやすいよ ...

JavaScriptで画像読み込み完了のタイミングを検知する「imagesLoaded」ライブラリの利用方法
JavaScriptで画像読み込み完了のタイミングを検知する「imagesLoaded」ライブラリの利用方法

大き目のサイズの画像をページに設置すると読み込み完了まで時間がかかる。その画像が ...

PHPでランダムなカラーコードを生成する「RandomColor.php」ライブラリの利用方法
PHPでランダムなカラーコードを生成する「RandomColor.php」ライブラリの利用方法

PHPでランダムなカラーコードを生成したい。自作するとなると「0~9」「a~f」 ...

JavaScriptライブラリChart.jsでグラフの描写する方法
JavaScriptライブラリChart.jsでグラフの描写する方法

JavaScriptでグラフを描写する必要があり、普段はHighchartを使用 ...