目次

ORマッパー - Idiorm

Version 1.5 (BSD License/2-clause)

y2sunlight 2020-03-11

定番ライブラリー に戻る

関連記事

サイト

テストプログラムの所在

{Project Folder}\test\

idiormについて

作者の言葉を借りるなら “You might think of Idiorm as a micro-ORM. (idiormはマイクロORMと考えると良いでしょう)“との事。本当に軽量なORマッパーです。選定に当たっては、Laravel5で使われているEloquentとどちらにするかで迷いましたが、兎に角シンプルだったので、idiormの方を選びました。また、ドキュメントもよく完備されており学習コストも少なそうだったのも決め手の一つになりました。

作者によれば、Idiormはバージョン1.5.0の時点(2914-06-22)で機能面では完成し、その後はバグの修正による保守のみになるそうです。その意味でidiormは既に(良い意味で)枯れているORMと言えるでしょう。軽量なORMについては、今度も他の動向に注視する必要がありますが、現時点ではidiormをお薦めしたいと思います。


インストール

composer require j4mie/idiorm
Using version ^1.5 for j4mie/idiorm
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing j4mie/idiorm (v1.5.6): Downloading (100%)
Writing lock file
Generating autoload files
1 package you are using is looking for funding.
Use the `composer fund` command to find out more!
Note:
Eclipse起動中にパッケージを取得した場合は、プロジェクト・エクスプローラー内の[プロジェクト(apricote)]を右クリックして[リフレッシュ]を選択して下さい。また、新しく取得したパッケージのインテリセンスが有効にならない場合は、プロジェクトのビルトまたはクリーン&ビルドを行ってビルドリストの更新を行って下さい。

パッケージの取得が終わると composer.jsonrequire に以下が追加されます。

composer.json
{
    "require": {
        "j4mie/idiorm": "^1.5"
    }
}


テストプログラム

このテストプログラムは、最初に実行した時に、SQLiteのデータベースファイル(test\var\db\sample.sqlite)を作成し、次のSQL文を実行してテスト用のテーブルを自動的に作ります。

CREATE TABLE IF NOT EXISTS USER(
  id INTEGER PRIMARY KEY autoincrement,
  email text,
  name text,
  created_at text
);
INSERT INTO USER VALUES(1,'y2sunlight@sample.com','y2sunlight', datetime('now'));

テスト用のコード(idiorm.php)を以下に示します。

idiorm.php
<?php
require __DIR__.'/../vendor/autoload.php';
 
// データベースファイルの準備
$db_file = __DIR__.'/var/db/sample.sqlite';
if (!file_exists($db_path=dirname($db_file)))
{
    mkdir($db_path,null,true);
}
 
// データベース接続
ORM::configure("sqlite:{$db_file}");
 
// PDOインスタンスを取得し、Raw-SQLでDDL文を実行する(テーブル作成)
$db = ORM::get_db();
$db->exec("
  CREATE TABLE IF NOT EXISTS user(
    id integer primary key autoincrement,
    email text,
    name text,
    created_at text
  );"
);
 
// テーブルが空の時、テスト用のデータを作る
$user = ORM::for_table('user')->find_one();
if ($user===false)
{
    // ORMインスタンスを使ってデータをInsert
    // (上の Create Tableと同様にPDOインスタンスによるRaw-SQLでも実装可)
    $user = ORM::for_table('user')->create();
    $user->email = 'y2sunlight@sample.com';           // オブジェクト風にセット
    $user->set('name','y2sunlight');                  // (key,value)でセット
    $user->set_expr('created_at', "datetime('now')"); // 式のセット
    $user->save();
}
 
// クエリの実行
// find_many()はORMオブジェクトを返すが、連想配列取得したい場合はfind_array()を使う
// また、>raw_query()を使えば、複雑なSQLを直接書くこともできる
$users = ORM::for_table('user')
  ->where_like('name', '%sun%')
  ->order_by_asc('name')
  ->find_many();
 
// 結果出力
header('Content-Type: text/html; charset=UTF-8');
?>
<!DOCTYPE html>
<html>
<head>
  <title>Idirom</title>
</head>
<body>
    <table>
    <tr>
        <th>id</th><th>email</th><th>name</th><th>created_at</th>
    </tr>
    <?php foreach ($users as $user){ ?>
    <tr>
        <td><?php echo $user->id ?></td>
        <td><?php echo $user->email ?></td>
        <td><?php echo $user->name ?></td>
        <td><?php echo $user->created_at ?></td>
    </tr>
    <?php } ?>
    </table>
</body>
</html>

上の例は、データベースにSQLiteを使用していますが、MySQL(MariaDB)を使用する場合のconfigure()は以下のようになります。

ORM::configure(array(
    'connection_string' => 'mysql:host=localhost;dbname=sunlight_db',
    'username' => 'sunlight',
    'password' => 'password',
    'caching' => true,  // Default(false)
    'logging' => true,  // Default(false)
    'logger' => function($log_string, $query_time) {
      // クエリーログ出力
    },
));

実行結果

id  email                  name        created_at
1   y2sunlight@sample.com  y2sunlight  2020-03-20 13:35:09