自動的な表のリンクと結合

自動的な表のリンクと結合 --  自動的な表のリンク - ::getLink(), ::getLinks(), ::joinAdd(), ::selectAs()

自動的な関連データの収集

データベースの設計時、しばしばいくつかの表が他と関連付けられます - 会員テーブルは個人の ID とそれらがメンバーであるグループ ID への参照を含んでいます。 リンクメソッド群を使用することで、 親変数にオブジェクトを自動的にフェッチする事ができます。

自動化されたリンクは、databasename.links.ini ファイルによってサポートされます。 これには表同士の関連と、 ある表のカラムから他方へのマッピングがストアされます。 この databasename.links.ini ファイルは、 主キーオブジェクトの関連情報を処理する、 または素早く複雑な複数テーブルを使用したクエリを構築するために getLinks() と joinAdd() メソッドで使用されます。

リンクを使用する他の方法は、getLink() メソッドを経由することです。 これは、カラムを明示し、それが他の表とカラムにどの様に関連しているかを database.links.ini を使わずに手動で指定する事ができます。

getlinks と joinAdd のゴールは、 コードが合理的で分かりやすい事を保証する限り、 2つのテーブルの接続を可能な限りシンプルで高速に作成することです。 以下の例では、初期フェッチ後のオブジェクトでさらなるデータを フェッチするために getlinks() がどのように使用できるかを例示しています。 また、完全な大きな結合クエリを構築する前に links ファイルをテストするためにも使用することができます。

例 39-1 リンクと結合のシンプルな導入

// just loop and fetch more information

$person = new DataObjects_Person;
$person->eyeColour = 'red';
$person->find();
while ($person->fetch()) {
    // this will look up in the cars table for the id matching the person->car value.

    $car = $person->getLink('car','cars','id');

    echo "{$person->name} has red eyes and owns a {$car->type}\n";
}





// now if you create a database.links.ini file with the car example
// the example would look like this.

$person = new DataObjects_Person;
$person->eyeColour = 'red';
$person->find();
while ($person->fetch()) {

    // use the links.ini file to automatically load
    // the car object into $person->_car
    $person->getLinks();

    echo "{$person->name} has red eyes and owns a {$person->_car->type}\n";
}






// and finally the most complex, using SQL joins and select as.
// the example would look like this.

$person = new DataObjects_Person;
$person->eyeColour = 'red';

// first, use selectAs as to make the select clauses match the column names.
$person->selectAs();

// now lets create the related element
$car = new DataObjects_Car;

// and for fun.. lets look for red eys and red cars..
$car->colour = 'red';

// add them together.
$person->joinAdd($car);

// since both tables have the column id in them, we need to reformat the query so
// that the car columns have a different name.

$person->selectAs($car,'car_%s');




$person->find();
while ($person->fetch()) {

    echo "{$person->name} has red eyes and owns a {$person->car_type}\n";
}

テーブルリンクのためのリンク ini ファイルの使用

DB_DataObject バージョン 0.3 はリンク ini ファイルの生成機能を取り入れました。これにより、ini ファイルを使用してカラムと他のデータベースカラムをマップする事ができます。この ini ファイルは 'databasename.links.ini' という名前を持ち、createTables.php によって意自動生成されるデータベーススキーマ ini ファイル 'databasename.ini' と同じフォルダに配置されます。

databasename.links.ini は各表に対するセクションを含んでおり、 リンクされるカラムと、表と関連付けられるカラムを等号で結びます。 以下の例では、person.owner が grp.id にリンクされるように 非主キーから主キーへの関連となっています。 これは person オブジェクトで getLinks() メソッドを実行すると、 3 つのテーブル - colurs, grp, attachments からデータをフェッチする事になるでしょう。

もし、キー (カラムからのリンク) に 'full stop' を使用する場合、 getLinks() メソッドは 'full stop' の左側と文字列がマッチするカラム名を表内から検索します。 そして、'full stop' をアンダースコアに置換し、 オブジェクト変数をその名前に割り当てます。もしくは、(joinAdd() メソッドを使用している場合) 他のオブジェクトから返されるべきカラムをどの様にしたいかを selectAs() メソッドを使用して決定することができます。

複数のカラムからなる複合キーによる結合も可能です。 以下の構文を使用します。

これは、次のような select 文になります (INNER JOIN 構文を使用します)。