PHPプロ!TIPS+

O/Rマッパー - Piece_ORM

以前のTipsでEZPDOというO/Rマッパーについてご紹介しましたが、今回は別のO/RマッパーであるPiece_ORMをご紹介したいと思います。

Piece_ORMは、Piece Framework が提供しているシンプルなオブジェクトリレーショナルマッピングフレームワークで、Piece以外のシステムと組み合わせて使うことも出来ます。

また、この8月中だけで 0.5.0, 0.6.0, 0.7.0 と3回もリリースされ、非常に精力的な開発が行われています。

それでは早速使ってみましょう。

Piece_ORMのインストールは、PEARコマンドを使用できますので、非常に簡単です。

まずは、PEARチャンネルを追加します。

  $ pear channel-discover pear.piece-framework.com

次に、Piece_ORMパッケージをインストールします。この際、必須となるPEARパッケージも自動的にインストールされます。

  $ pear install piece/piece_orm-beta

そして、使用するデータベース用のMDB2ドライバをインストールします。例えば、MySQLを使用する場合は、

  $ pear install pear/mdb2_driver_mysql

PostgreSQLを使用する場合は、

  $ pear install pear/mdb2_driver_pgsql

のようになります。

今度は、作業用のディレクトリを作成します。

  $ mkdir piece_orm
  $ cd piece_orm
  $ mkdir -p cache config/mappers scripts imports/spyc data/sql

また、PHPでYAMLを扱うためのクラスであるSpycが必要になりますので、ダウンロードしてimports/spycへインストールします。

  $ cd imports
  $ wget http://prdownloads.sourceforge.net/spyc/spyc-0.2.5.tar.gz?download
  $ tar xzf spyc-0.2.5.tar.gz -C spyc
  $ cd ..

次に、以下の5つのファイルを作成します。なお、User.yamlは空っぽで構いません。

□config/piece-orm-config.yaml

- name: piece_orm
  dsn: mysql://user:password@hostname/piece_orm

□config/mappers/User.yaml

□scripts/insert.php

<?php
error_reporting
(E_ALL);
set_include_path(dirname(__FILE__) . '/../imports/spyc' PATH_SEPARATOR 
get_include_path());

require_once 
'Piece/ORM.php';
require_once 
'Piece/ORM/Error.php';

Piece_ORM_Error::pushCallback(create_function('$error''var_dump($error);
 return ' 
PEAR_ERRORSTACK_DIE ';'));
Piece_ORM::configure('../config''../cache''../config/mappers');

$mapper = &Piece_ORM::getMapper('User');
$user = &$mapper->createObject();
$user->firstName 'Tips';
$user->lastName 'PHPPro';
var_dump($mapper->insert($user));
?>

□scripts/find.php

<?php
error_reporting
(E_ALL);
set_include_path(dirname(__FILE__) . '/../imports/spyc' PATH_SEPARATOR 
get_include_path());

require_once 
'Piece/ORM.php';
require_once 
'Piece/ORM/Error.php';

Piece_ORM_Error::pushCallback(create_function('$error''var_dump($error);
 return ' 
PEAR_ERRORSTACK_DIE ';'));
Piece_ORM::configure('../config''../cache''../config/mappers');

$mapper = &Piece_ORM::getMapper('User');
var_dump($mapper->findAll());
?>

□data/sql/create_user.sql

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL auto_increment,
  `first_name` varchar(255) NOT NULL,
  `last_name` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
);

最後に、使用するデータベースを作成します。今回はMySQLを使用することにします。

  $ mysql -h hostname -u user -p
  mysql> create database piece_orm;
  mysql> Bye
  $ mysql -u user -p -h hostnmae piece_orm < data/sql/create_user.sql

これで準備ができましたので、スクリプトを実行してみましょう。

  $ cd scripts
  $ php insert.php
  int(1)
  $ php find.php
  array(1) {
    [0]=>
    &object(stdClass)#10 (3) {
      ["id"]=>
      string(1) "1"
      ["firstName"]=>
      string(4) "Tips"
      ["lastName"]=>
      string(8) "PHPPro"
    }
  }

特に問題が無ければ、insert.phpでデータが登録され、find.phpでそのデータの一覧が取得できます。

さて、スクリプトにはSQLが記述されていませんが、どのようなSQLが実行されているのでしょうか?

では、cacheディレクトリにある一番サイズの大きなファイルを覗いてみましょう。 SQL文やメソッドがずらっと並んでいるかと思います。fildAll()やinsert()はここに書かれたSQLが実行されています。

また、Piece_ORMは、マッパー定義ファイルによってSQLと任意のメソッドをマッピングできるという特徴をもっています。 それでは、User.yamlを次のように書き換えて、insert()のSQLを上書きしてみましょう。

□config/mappers/User.yaml

- name: insert
  query: INSERT INTO user (first_name, last_name) VALUES ($firstName, 'PHP Pro!')

では、再度実行してみます。

  $ php insert.php
  int(2)
  $ php find.php
  array(2) {
    [0]=>
    &object(stdClass)#10 (3) {
      ["id"]=>
      string(1) "1"
      ["firstName"]=>
      string(4) "Tips"
      ["lastName"]=>
      string(8) "PHPPro"
    }
    [1]=>
    &object(stdClass)#11 (3) {
      ["id"]=>
      string(1) "2"
      ["firstName"]=>
      string(4) "Tips"
      ["lastName"]=>
      string(8) "PHP Pro!"
    }
  }

無事、上書きしたinsertクエリが実行されました。もう一度cacheディレクトリのファイルを覗くと、SQLが書き換わっているはずです。

以上、駆け足のご紹介となりましたが、もっと詳細に書かれたドキュメントが用意されていますので、興味をもたれた方は試してみては如何でしょうか。

Piece_ORM短期集中コース
http://trac.piece-framework.com/piece-doc/wiki/ja/users/piece-orm/QuickStart/CrashCourseInPiece_ORM

バックナンバーについて

TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。

Tipsꗗy[W 

Pick Up Q&A

Q
負荷時のmysql_connect()エラー
 このエントリーをはてなブックマークに追加 
A
これはPHPというよりOSまたはMySQLのコミュニティで質問されたほうがいいと思います。 ぱっと思いついた範囲で記すと MySQL等のDBに「ある時点において同時に接続可能なクライアントの最大数」に制限があるよう...

>>続きを読む

今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)