title = "なれるSE 9"; // 値をセット $book->price = 572; // 値をセット $id = R::store($book); // インスタンスを保存 (レコードの id が返る) これを実行すると、store のタイミングで、データベースに、books テーブル、id, title カラムが作成され、レコードが保存されます。 動的にテーブルやカラムを追加してレコードを保存してくれます。" />title = "なれるSE 9"; // 値をセット $book->price = 572; // 値をセット $id = R::store($book); // インスタンスを保存 (レコードの id が返る) これを実行すると、store のタイミングで、データベースに、books テーブル、id, title カラムが作成され、レコードが保存されます。 動的にテーブルやカラムを追加してレコードを保存してくれます。" />

お手軽そうな PHP O/R マッパー RedBeanPHP4

ちょっとしたプロトタイピングで DB 操作をサクッとやりたいので、何か良い OR マッパーはないかと適当に見回してみたところ、良さそうなのがあったので使ってみました。

要求環境

環境は PHP 5.3.4 以降で、各種 DB 用に PDO もインストール済みであること。

PHP 5.2 以前なら 3.5 系を使ってくれとのこと。

PHP 5.3.3 以前にもパッチが提供されていましたが、今回は利用しません。

対応している DB は MariaDB(MySQL), PostgreSQL, SQLite, CUBRID とメジャーなものに対応しています。(CRUBRID は初めてみましたが)

インストール

ダウンロードしてアーカイブを展開すると、rb.php, license.txt の2個だけファイルが入っています。

rb.php だけで動作するので、コレを require するだけです。シンプルでお手軽な感じがいいですね。

require "rb.php";

次にデータベースへの接続です。接続サンプルコードがありますが、今回は SQLite を使います。

R::setup("sqlite:/path/to/sqlite.db");

ちなみにココではまだこの DB ファイルを用意しません。

RedBeanPHP4 は動的にテーブルやカラムを追加してくれます。

レコードの作成

コードで分かってもらえると思います。

$book = R::dispense("books"); // インスタンスを生成
$book->title = "なれるSE 9"; // 値をセット
$book->price = 572; // 値をセット
$id = R::store($book); // インスタンスを保存 (レコードの id が返る)

これを実行すると、store のタイミングで、データベースに、books テーブル、id, title カラムが作成され、レコードが保存されます。

動的にテーブルやカラムを追加してレコードを保存してくれます。

型もプロパティとして設定した値に対応した型(数字なら INTEGER 、文字なら TEXT など)で設定してくれます。

2つ目のインスタンスに別の名前のプロパティで値を持たせることで、後からカラムを増やすこともできました。

ただ、上記例に加えて price に文字列を入れて保存すると、最初の保存で INTEGER 型だった price カラムが TEXT 型になってしまいました。

ちょっと不安のある動作ですが、プロトタイピングなどには良さそうです。

もちろん定義を固定させて動作させる設定もあります。

R::freeze(TRUE);

セットアップの後で実行すれば、未定義のテーブルやカラムを指定した場合にエラーが発生するようになります。

レコードの取得

$book = R::load("books", $id); // id のレコードインスタンスを取得

レコードの更新

$book->title = "なれるSE 10"; // 値を再セット
R::store($book);

レコードの削除

R::trash($book);

最後に操作が済んだので、コネクションのクローズをします。

R::close();

もちろんこれだけでなく、条件付きの find や、素のクエリを投げたり、トランザクションにも対応しており、リレーションを扱うこともでき、かなり高機能のようです。

個人的にちょっとだけ不満だったのは、レコードの作成日時、更新日時を自動的に入れてくれないところでしょうか。

ひと通り調べてみたんですが、設定や実装を見つけられませんでした。やり方あるんでしょうか?できれば自前ではやりたくないですよね。

現在日時を返す R::isoDateTime() メソッドの紹介があったので、これを使うようです。

これからのロードマップも敷かれており、まだまだこれからも開発が進んでいくようなので、将来、PHP O/R マッパーの選択肢の一つとなりうるのではないでしょうか。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする