Data Mapper

*Available from Prado versions 3.1a onwards.

*PRADOバージョン3.1a以降使用可能です。

Data Mappers moves data between objects and a database while keeping them independent of each other and the mapper itself. If you started with Active Records, you may eventually faced with more complex business objects as your project progresses. When you build an object model with a lot of business logic it's valuable to use these mechanisms to better organize the data and the behavior that goes with it. Doing so leads to variant schemas; that is, the object schema and the relational schema don't match up.
それらを互いとマッパー自身から独立にしておく間に、データマッパーはデータをオブジェクトとデータベースの間に移動させます。あなたがActive Recordで始めたならば、あなたは結局、より複雑なビジネスオブジェクトに直面して、あなたのプロジェクトが進歩する時にしてさしつかえありません。あなたがたくさんのビジネスロジックによってオブジェクト・モデルを組み立てる時に、よりよく、それと一緒に行くデータと行動を組織化するためにこれらのメカニズムを使うことは貴重です。そうすることは異なったschemasをもたらしています;すなわちオブジェクトスキーマと関係のスキーマは調和していません。
The Data Mapper separates the in-memory objects from the database. Its responsibility is to transfer data between the two and also to isolate them from each other. With Data Mapper the in-memory objects needn't know even that there's a database present; they need no SQL interface code, and certainly no knowledge of the database schema. (The database schema is always ignorant of the objects that use it.)
データマッパーはデータベースからメモリーにおけるオブジェクトを分離します。その責任は、データを両者の間に移し、互いに彼らを隔離することでもあります。データ マッパーによって、メモリーにおけるオブジェクトは、データベースプレゼントがある知りさえする必要がありません;彼らはSQLインターフェースコードと確かなデータベーススキーマに関する知識が全然必要でありません。(データベーススキーマは、いつも、それを使うオブジェクトを知らない。)

When to Use It

The primary occasion for using Data Mapper is when you want the database schema and the object model to evolve independently. Data Mapper's primary benefit is that when working on the business (or domain) objects you can ignore the database, both in design and in the build and testing process. The domain objects have no idea what the database structure is, because all the correspondence is done by the mappers.
データ マッパーを使うための主要な機会は、あなたがデータベーススキーマとオブジェクト・モデルに、独立して発展してほしい時です。データ マッパーの主要な利点は、ビジネス(またはドメイン)オブジェクトに取り組む時に、あなたがデザインの中で、そして構造とテストプロセスにおいてデータベースを無視することができることです。すべての一致がマッパーによってされるので、ドメインオブジェクトはデータベース構造が何であるか全く分かりません。
This helps you in the code because you can understand and work with the domain objects without having to understand how they're stored in the database. You can modify the business models or the database without having to alter either. With complicated mappings, particularly those involving existing databases, this is very valuable.
あなたが、どうそれらがデータベースに蓄えられるかを理解することなくドメインオブジェクトによって理解し、働くことができるので、これはコードの中であなたを助けます。あなたは、どちらも変更することなくビジネス・モデルまたはデータベースを修正することができます。複雑なマッピング(特にそれらの関係の既存のデータベース)によって、これは非常に貴重です。
The price, of course, is the extra layer that you don't get with Active Record, so the test for using these patterns is the complexity of the business logic. If you have fairly simple business logic, an Active Record will probably work. For more complicated logic a Data Mapper may be more suitable.
価格はもちろん、あなたがActive Recordによって得ない特別なレイヤーであるので、これらのパターンを使うためのテストはビジネスロジックの複雑さです。あなたがかなり簡単なビジネスロジックを持っているならば、Active Recordはたぶん働くでしょう。より複雑なロジックのために、データマッパーはより適当であるかもしれません。

SqlMap Data Mapper

The SqlMap DataMapper framework makes it easier to use a database with a PHP application. SqlMap DataMapper couples objects with stored procedures or SQL statements using a XML descriptor. Simplicity is the biggest advantage of the SqlMap DataMapper over object relational mapping tools. To use SqlMap DataMapper you rely on your own objects, XML, and SQL. There is little to learn that you don't already know. With SqlMap DataMapper you have the full power of both SQL and stored procedures at your fingertip.
SqlMapデータマッパーフレームワークは、PHPアプリケーションによってデータベースを使うことをより容易にします。XML記述子を使って、SqlMapデータマッパーはオブジェクトを蓄えられた手続またはSQLステートメントと結び付けます。シンプルさはオブジェクト関係マッピングツールよりSqlMapデータマッパーの最も大きな利点です。SqlMapデータマッパーを使うために、あなたはあなた自身のオブジェクト、XML、およびSQLに頼っています。あなたがすでに知らないことを知るものがほとんどありません。SqlMapデータマッパーによって、あなたはあなたの指先のSQLと蓄えられた手続の両方のフルパワーを持っています。
diagram.png
Here's a high level description of the work flow illustrated in the figure above. Provide a parameter, either as an object or a primitive type. The parameter can be used to set runtime values in your SQL statement or stored procedure. If a runtime value is not needed, the parameter can be omitted.
ここに数値において上に説明されたワークフローのハイレベルな説明があります。 オブジェクトまたは原始的なタイプとしてパラメータを提供してください。パラメータは、ランタイム値をあなたのSQLステートメントまたは蓄えられた手続に設定するために使われることができます。ランタイム値が必要でないならば、パラメータは省略されることができます。
Execute the mapping by passing the parameter and the name you gave the statement or procedure in your XML descriptor. This step is where the magic happens. The framework will prepare the SQL statement or stored procedure, set any runtime values using your parameter, execute the procedure or statement, and return the result.
あなたがあなたのXML記述子の中でステートメントまたは手続に与えたパラメータと名前を通過することによって、マッピングを実行してください。このステップは、魔法が起こる所です。フレームワークはSQLステートメントまたは蓄えられた手続を準備し、どのようなランタイム値でもあなたのパラメータを使うことにし、手続またはステートメントを実行し、結果を戻すでしょう。
In the case of an update, the number of rows affected is returned. In the case of a query, a single object, or a collection of objects is returned. Like the parameter, the result object, or collection of objects, can be a plain-old object or a primitive PHP type.
アップデートの場合に、影響された列の数は戻ります。クエリーの場合に、オブジェクトの1つのオブジェクトまたはコレクションは戻ります。パラメータのように、結果オブジェクトまたはオブジェクトのコレクションはただの老人のオブジェクトまたは原始的なPHPタイプであるかもしれません。

Setting up a database connection and initializing the SqlMap

A database connection for SqlMap can be set as follows. See Establishing Database Connection for futher details regarding creation of database connection in general.
SqlMapのためのデータベース接続は次の通り設定されることができます。一般的なデータベース接続構築についての詳細は一般データベース接続の作成を見るのを見てください。
//create a connection and give it to the SqlMap manager.
$dsn = 'pgsql:host=localhost;dbname=test'; //Postgres SQL
$conn = new TDbConnection($dsn, 'dbuser','dbpass');
$manager = new TSqlMapManager($conn);
$manager->configureXml('my-sqlmap.xml');
$sqlmap = $manager->getSqlMapGateway();
The TSqlMapManager is responsible for setting up the database connection and configuring the SqlMap with given XML file(s). The configureXml() method accepts a string that points to a SqlMap XML configuration file. Once configured, call the getSqlMapGateway() method to obtain an instance of the SqlMap gateway interface (use this object to insert/delete/find records).
TSqlMapManagerは、データベース接続を設定し、与えられたXMLファイル(s)によってSqlMapを設定することについて責任があります。configureXml()メソッドは、SqlMap XMLコンフィギュレーションファイルを指し示すストリングを受け入れます。設定されたら、通用するgetSqlMapGateway()の方法を、SqlMapゲートウェイインターフェース(レコードを挿入する/削除する/見つけるために、このオブジェクトを使ってください)のインスタンスと呼んでください。
SqlMap database connection can also be configured using a <module> tag in the application.xml or config.xml as follows.
SqlMapデータベース接続は、また、次の通りapplication.xmlまたはconfig.xmlにおいて<モジュール>タグを使って、設定されることができます。
<modules>
 <module id="my-sqlmap" class="System.Data.SqlMap.TSqlMapConfig"
       EnableCache="true" ConfigFile="my-sqlmap.xml" >
   <database ConnectionString="pgsql:host=localhost;dbname=test"
       Username="dbuser" Password="dbpass" />
 </module>
</modules>
The ConfigFile attribute should point to a SqlMap configuration file (to be detailed later) either using absolute path, relative path or the Prado's namespace dot notation path (must omit the ".xml" extension).
絶対パス、相対パス、またはプラドのnamespaceドット表記法進路(「.xml」拡張を省略しなければなりません)を使って、ConfigFile属性は、SqlMapコンフィギュレーションファイルを示す(後で詳細なため)べきです。
Tip
The EnableCache attribute when set to "true" will cache the parsed configuration. You must clear or disable the cache if you make changes to your configuration file. A cache module must also be defined for the cache to function.
秘訣
「確かです」に設定されるEnableCache属性は構文解析されたコンフィギュレーションをキャッシュするでしょう。あなたがあなたのコンフィギュレーションファイルに変更を加えるならば、あなたはキャッシュをきれいにするか、使用不可にしなければなりません。キャッシュモジュールは、また、キャッシュが作動するように定義されなければなりません。
To obtain the SqlMap gateway interface from the <module> configuration, simply do, for example,
例えば、SqlMapゲートウェイインターフェースを<module>コンフィギュレーションから得るために、単に、してください。
class MyPage extends TPage
{
   public function onLoad($param)
   {
       parent::onLoad($param);
       $sqlmap = $this->Application->Modules['my-sqlmap']->Client;
       $sqlmap->queryForObject(...); //query for some object
   }
}

A quick example

Let us consider the following "users" table that contains two columns named "username" and "email", where "username" is also the primary key.
私達に、以下を、「ユーザーネーム」と「Eメール」(そこで、「ユーザーネーム」はまたプライマリキーです)と名付けられた2つのカラムを含んでいる「ユーザー」テーブルと考えさせてください。
CREATE TABLE users
(
   username VARCHAR( 20 ) NOT NULL ,
   email VARCHAR( 200 ) ,
   PRIMARY KEY ( username )
);
Next we define our plain User class as follows. Notice that the User is very simple.
class User
{
   public $username;
   public $email;
}
Next, we need to define a SqlMap XMl configuration file, lets name the file as my-sqlmap.xml
次に、私達は、SqlMap XMlコンフィギュレーションファイルを定義する必要があり、my-sqlmap.xmlとしてファイルを名付けさせます。
<?xml version="1.0" encoding="utf-8" ?>
<sqlMapConfig>
   <select id="SelectUsers" resultClass="User">
       SELECT username, email FROM users
   </select>
</sqlMapConfig>
The <select> tag returns defines an SQL statement. The id attribute will be used as the identifier for the query. The resultClass attribute value is the name of the class the the objects to be returned. We can now query the objects as follows:
<select>タグリターンはSQLステートメントを定義します。id属性はクエリーのために識別子として使われるでしょう。resultClass属性価値はクラスの名前です the the 戻されるオブジェクト 。私達は現在次の通りオブジェクトを質問することができます:
//assume that $sqlmap is an TSqlMapGateway instance
$userList = $sqlmap->queryForList("SelectUsers");

//Or just one, if that's all you need:
$user = $sqlmap->queryForObject("SelectUsers");
The above example shows demonstrates only a fraction of the capabilities of the SqlMap Data Mapper. Further details can be found in the SqlMap Manual.
上記の例ショーはSqlMapデータマッパーの機能の小数部だけを示します。さらなる詳細はSqlMapマニュアルの中で発見されることができます。

Combining SqlMap with Active Records

The above example may seem trival and it also seems that there is alot work just to retrieve some data. However, notice that the User class is totally unware of been stored in the database, and the database is unware of the User class.
上記の例はtrivalようであるかもしれず、また、いくつかのデータを検索するだけalot仕事があるようです。 しかし、ユーザークラスが、すっかり、無製品 of データベースに蓄えられる であることに気づいてください。データベースはユーザークラスの無製品です。
One of advantages of SqlMap is the ability to map complex object relationship, collections from an existing database. On the other hand, Active Record provide a very simple way to interact with the underlying database but unable to do more complicated relationship or collections. A good compromise is to use SqlMap to retrieve complicated relationships and collections as Active Record objects and then using these Active Records to do the updates, inserts and deletes.
SqlMapの利点の1つは、複雑なオブジェクト関係(既存のデータベースからのコレクション)の地図を作る能力です。一方では、Active Recordは、潜在的なデータベースと対話するけれどもより複雑な関係またはコレクションをすることができない非常に簡単な方法を提供します。よい妥協案は、Active Recordオブジェクトとして複雑な関係とコレクションを取り出すためにSqlMapを使うことになっていて、それから、アップデートをするためにこれらのActive Recordを使って、挿入し、削除します。
Continuing with the previous example, we change the definition of the User class to become an Active Record.
前の例を続行して、Active Recordになるために、私達はユーザークラスの定義を変更します。
class UserRecord extends TActiveRecord
{
   const TABLE='users'; //table name

   public $username; //the column named "username" in the "users" table
   public $email;

   /**
    * @return TActiveRecord active record finder instance
    */
   public static function finder($className=__CLASS__)
   {
       return parent::finder($className);
   }
}
We also need to change the definition of the SqlMap XML configuration. We just need to change the value of resultClass attribute to UserRecord.
私達はまた、SqlMap XMLコンフィギュレーションの定義を変更する必要があります。 私達はただ、resultClass属性の価値をUserRecordに変更する必要があります。
<?xml version="1.0" encoding="utf-8" ?>
<sqlMapConfig>
   <select id="SelectUsers" resultClass="UserRecord">
       SELECT username, email FROM users
   </select>
</sqlMapConfig>
The PHP code for retrieving the users remains the same, but SqlMap returns Active Records instead, and we can take advantage of the Active Record methods.
ユーザーを救うためのPHPコードは同じであり続けるけれども、SqlMapは代わりにActive Recordを戻し、私達はActive Recordメソッドを利用することができます。
//assume that $sqlmap is an TSqlMapGateway instance
$user = $sqlmap->queryForObject("SelectUsers");

$user->email = 'test@example.com'; //change data
$user->save(); //save it using Active Record

References

  • Fowler et. al. Patterns of Enterprise Application Architecture, Addison Wesley, 2002.
  • iBatis Team. iBatis Data Mapper, http://ibatis.apache.org.
  • ファウラーet. al。企業アプリケーションアーキテクチャ、アディソン・ウェスリー、2002年のパターン。
  • iBatis Team. iBatisデータマッパー、http://ibatis.apache.org