ひとつのテーブルによる例

これ以降の例でのリレーショナル DAS のデータグラフの構成は次のようになります。 アプリケーションデータオブジェクトがひとつだけ、ひとつの会社に関する情報が company テーブルに格納されています。これらの例は SDO の機能を活用するものではありませんし、 直接 SQL 文を発行したほうがずっと効率的でしょう。 これらの例は、リレーショナル DAS をどのように使用するのかを説明するためのものです。

そのため、データベースのメタデータは極力シンプルになるようにしました。 company テーブルだけしか含まないようにしています。 コンストラクタで使用している二番目、三番目の引数や、 クエリの例で使用しているカラム指定子は、オプションとなります。

例1 データオブジェクトの作成

もっとも単純な例として、データオブジェクトをひとつ作成して それをデータベースに書き込むことを考えます。この例では、 company オブジェクトがひとつ作成されます。その名前を 'Acme' と指定したうえで、リレーショナル DAS をコールして 変更内容をデータベースに書き込みます。会社名を設定する際には、 プロパティ名を使用します。オブジェクトのプロパティにアクセスする その他の方法については、SDO の を参照ください。

データオブジェクトを作成できるのは、 あらかじめ先立つデータオブジェクトがある場合のみです。そのため、 リレーショナル DAS への最初のコールは、 まずルートオブジェクトを取得するためのものとなります。 これは、空のデータグラフの作成をすることで行います。 特別なルートオブジェクトは、木構造の真のルートとなるものです。 company データオブジェクトは、その後ルートオブジェクトに対して createDataObject() をコールすることで作成します。 これは、company データオブジェクトを作成して、 データグラフのルートオブジェクトの 'company' という名前のプロパティにそれを挿入します。

リレーショナル DAS が変更を適用する際には、シンプルな insert 文 'INSERT INTO company (name) VALUES ("Acme");' が実行されます。 自動生成された主キーがデータオブジェクトに設定され、 変更概要がリセットされます。そのため、同じデータオブジェクトを そのまま使い続け、さらに変更した内容をもう一度適用することもできます。

<?php
require_once 'SDO/DAS/Relational.php';
require_once 
'company_metadata.inc.php';

/**************************************************************
* メタデータから、DAS を作成します。
***************************************************************/
$das = new SDO_DAS_Relational ($database_metadata,'company',$SDO_containment_metadata);

/**************************************************************
* ルートオブジェクトを取得し、その下に company オブジェクトを
* 作成します。そしてデータオブジェクトに対して変更を加えます。
***************************************************************/
$root $das  -> createRootDataObject();
$acme $root -> createDataObject('company');

$acme->name "Acme";

/**************************************************************
* データベースに接続し、オブジェクトをデータベースに書き込みます。
***************************************************************/
$dbh = new PDO(PDO_DSN,DATABASE_USER,DATABASE_PASSWORD);
$das -> applyChanges($dbh$root);
?>

例2 データオブジェクトの取得

この例では、データベースから取得されるデータオブジェクトはひとつです。 あるいは、もし 'Acme' という名前の会社を複数登録していたのなら、 複数返される可能性もあります。返された会社データのそれぞれについて、 プロパティ name および id の値を出力します。

この例における executeQuery() の 3 番目の引数では、カラム名に修飾子が必要です。 というのも、メタデータ内の他のテーブルで name および id という名前のカラムが用いられているからです。 もし名前が重複するような心配がないのなら、これは省略できます。

<?php
require_once 'SDO/DAS/Relational.php';
require_once 
'company_metadata.inc.php';

/**************************************************************
* メタデータから、DAS を作成します。
***************************************************************/
$das = new SDO_DAS_Relational ($database_metadata,'company',$SDO_containment_metadata);

/**************************************************************
* データベース接続を取得します。
***************************************************************/
$dbh = new PDO(PDO_DSN,DATABASE_USER,DATABASE_PASSWORD);

/**************************************************************
* クエリを発行し、company オブジェクトを取得します。
* 複数存在するかもしれません。
***************************************************************/
$root $das->executeQuery($dbh,
         
'select name, id from company where name="Acme"',
          array(
'company.name''company.id') );

/**************************************************************
* name および id を出力します。
***************************************************************/
foreach ($root['company'] as $company) {
  echo 
"データベースから取得した会社の名前は " .
  
$company['name'] . " で、その id は " $company['id'] . " です\n";
}
?>

例3 データオブジェクトの更新

この例は、これまでのふたつを組み合わせたものです。というのも、 オブジェクトを更新するには、まずそれを取得しなければならないからです。 この例のコードは、会社名を逆さにし (つまり 'Acme' が 'emcA' となります)、 オブジェクトを作成したときと同じ方法でそれをデータベースに書き戻します。 この例のクエリではその両方の会社名で検索しているので、 プログラムを繰り返し実行すると、そのたびに会社名が反転します。

この例では、同じリレーショナル DAS のインスタンスが applyChanges() で再利用されます。 ちょうど PDO データベースハンドルと同じような扱いです。 このように使用しても問題ありません。また、既存のインスタンスを破棄して 新しいインスタンスを作り直すこともできます。 データグラフをアプリケーションに返した後は、 その状態に関する情報はリレーショナル DAS から削除されます。 必要なデータはすべてデータグラフ自身が保持しており、 もしそれが存在しない場合はメタデータから再作成されます。

<?php
require_once 'SDO/DAS/Relational.php';
require_once 
'company_metadata.inc.php';

/**************************************************************
* メタデータから、DAS を作成します。
***************************************************************/
$das = new SDO_DAS_Relational ($database_metadata,'company',$SDO_containment_metadata);

/**************************************************************
* データベース接続を取得します。
***************************************************************/
$dbh = new PDO(PDO_DSN,DATABASE_USER,DATABASE_PASSWORD);

/**************************************************************
* クエリを発行し、company オブジェクトを取得します。
* 複数存在するかもしれません。
***************************************************************/
$root $das->executeQuery($dbh,
  
'select name, id from company where name="Acme" or name="emcA"',
  array(
'company.name''company.id') );

/**************************************************************
* 最初の会社の名前を変更します。
***************************************************************/
$company $root['company'][0];
echo 
"取得した会社の名前は " $company->name " です\n";
$company->name strrev($company->name);

/**************************************************************
* 変更内容を書き戻します。
***************************************************************/
$das->applyChanges($dbh,$root);
?>

例4 データオブジェクトの削除

'Acme'、あるいはその逆の 'emcA' という名前の会社をすべて取得することができました。 次に、これらをすべてグラフから削除するために unset を使用します。

この例では、ひとつの動作ですべてが削除されます。つまり、該当する (包含関係を定義する) プロパティを解放します。 これらを個別に削除していくことも可能です。

<?php
require_once 'SDO/DAS/Relational.php';
require_once 
'company_metadata.inc.php';

/**************************************************************
* メタデータから、DAS を作成します。
***************************************************************/
$das = new SDO_DAS_Relational ($database_metadata,'company',$SDO_containment_metadata);

/**************************************************************
* データベース接続を取得します。
***************************************************************/
$dbh = new PDO(PDO_DSN,DATABASE_USER,DATABASE_PASSWORD);

/**************************************************************
* クエリを発行し、company オブジェクトを取得します。
* 複数存在するかもしれません。
***************************************************************/
$root $das->executeQuery($dbh,
  
'select name, id from company where name="Acme" or name="emcA"',
  array(
'company.name''company.id') );

/**************************************************************
* データグラフのすべての会社を削除します。
***************************************************************/
unset($root['company']);

/**************************************************************
* 変更内容を書き戻します。
***************************************************************/
$das->applyChanges($dbh,$root);
?>