この記事では、Zend Framework での Zend_Db_Table テーブル関連付けの使用方法について説明します。参考のために皆さんと共有してください。詳細は次のとおりです:
紹介:
RDBMSでは、テーブル間には1対多対応、多対多対応など様々な関係があります。
Zend フレームワークは、これらの関係の実装を容易にするいくつかのメソッドを提供します。
関係の定義:
この記事で使用される例の関係定義は次のとおりです:リーリー
この例では、Accounts、Products、Bugs、BugsProducts という 4 つのクラスが定義されています。このうち、Accounts、Products、および Bugs は 3 つのエンティティ テーブルであり、BugsProducts はリレーションシップ テーブルです。これら 3 つのエンティティをもう一度分析してみましょう。アカウントには複数のバグがあり、それらの間には 1 対多の関係がありますが、バグと製品には多対多の関係があります。
$_dependentTables は、オブジェクトに関連付けられたオブジェクト名です。ここでは、関連付けられたデータベース名の代わりにオブジェクト名を記述する必要があります。
$_referenceMap 配列は、他のテーブルとの関係を定義するために使用され、それらのテーブルとの関係と、どのような関係があるかを設定できます。最初に設定するのはルールキーで、上記の例では「Reporter」や「Engineer」などです。ルール キーの機能は実際にはリレーションシップの名前であり、他のデータベース テーブル名や他のオブジェクト名と同じである必要はありません。マーキングのためだけに、このルール キーの役割は後で確認できます。
各ルールの下にはいくつかの定義があります: (特別な指示はありません。すべては上記の「レポーター」関係で説明されています)
columns=> 他のテーブルに関連付けられたフィールド名を設定します。上記の「report_by」は、データベース内のテーブル Bugs の report_by フィールドです。ここではフィールドは 1 つだけですが、複数のフィールドを設定することもできます。
refTableClass=> このテーブルに関連するテーブルを設定するために使用されます。ここで、テーブル名の代わりにターゲット テーブルのオブジェクトの名前を使用する必要があることに注意してください。この例では、「Account」オブジェクトに関連付けられています。
refColumns =>コンタクトが発生するテーブルのフィールドを設定します。複数のフィールドに関連する場合は、複数の列に対応させる必要があります。この設定は実際にはオプションです。空の場合、関連フィールドは関連テーブルの主キーとして自動的に設定されます。上記の例では、主キーは関連フィールドとして使用されないため、手動で設定されます。
onDelete=> オプションのフィールドで、削除時のアクションを設定します。
onUpdate=> オプションのフィールドで、テーブルを更新するときのアクションを設定します。
関連テーブルからデータを取得します:
すでにクエリ結果を取得している場合は、次のステートメントを使用して、この結果に関連付けられたテーブルのクエリ結果を取得できます。 リーリーこの方法では通常、1対多に対応する2つのエンティティテーブルと、多対多に対応する1つのリレーションシップテーブルを使用します。一方のエンティティテーブルともう一方のエンティティテーブルからデータを取得する方法を以下に説明します。
最初のフィールド $table は、このテーブルに関連付けられるテーブルに対応するクラス名を参照します。 2 番目のフィールドはオプションであり、先ほど述べたルール キーであり、省略した場合は、テーブル内の最初のリレーションシップがデフォルトになります。以下に例を示します:
リーリーこの例では、最初に 1234 という番号のユーザーを読み取り、次にこの人物が報告したバグを見つけました。デフォルトでは zend が最初の関連付けであるため、ここでのアカウントに関連付けられている最初の関連付けは「Reporter」であるため、Reporter レコードが削除されました。
エンジニアなどの他のレコードを取り出したい場合は、次の方法に従うことができます:
リーリー findDependentRowset の使用に加えて、「Magic Method」と呼ばれる仕組みを使用することもできます。なぜそう呼ばれるかというと、手品のようなものだからです。したがって、メソッド findDependentRowset('
- $row->find
注: このメカニズムは Ruby on Rails で初めて見られました。ここでの
1 対多の関係で 1 から多に取得する方法を紹介しました。今度は、多から 1 を取得します。実際には、多の中の 1 つから対応するレコードを取得します。
同様に、次のステートメントもあります:
リーリー同様に、$table はクラス名で、オプションのパラメーター $rule には対応するルール キーが入力されます。以下に例を示します:
リーリー上記との違いは、上記で返されるのは複数のレコードのコレクションであり、今回返されるのは 1 つのレコードである必要があることです。次の例は、ルールを設定する例です:
リーリールールを記入するだけです。同様に、このメソッドにも「魔法のフィールド」があります。 findParentRow('
- $row->findParent
- $row->findParent
例子:
取得多对多关系表的字段:
上面两个方法讲述了一对多的使用,下面就是多对多了。我们使用如下方法取得多对多关系表的数据:
$row->findManyToManyRowset($table, $intersectionTable, [$rule1, [$rule2]]);
这里参数变成了4个,因为需要增加一个关系表来存储多对多的关系。
$table是与之发生多对多关系的表的类名,$intersectionTable是中间存储关系的关系表的类名。$rule1和$rule2是上面两个数据表的Rule Key。省略Rule Key的例子如下:
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->find(1234); $bug1234 = $bugsRowset->current(); $productsRowset = $bug1234->findManyToManyRowset('Products', 'BugsProducts');
下面是该方法的全部参数调用例子:
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->find(1234); $bug1234 = $bugsRowset->current(); $productsRowset = $bug1234->findManyToManyRowset('Products', 'BugsProducts', 'Bug');
这次的“魔术方法”是,对应 findManyToManyRowset('
- $row->find
- $row->find
- $row->find
例子:
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->find(1234); $bug1234 = $bugsRowset->current(); // Use the default reference rule $products = $bug1234->findProductsViaBugsProducts();// Specify the reference rule $products = $bug1234->findProductsViaBugsProductsByBug();
更多关于zend相关内容感兴趣的读者可查看本站专题:《Zend FrameWork框架入门教程》、《php优秀开发框架总结》、《Yii框架入门及常用技巧总结》、《ThinkPHP入门教程》、《php面向对象程序设计入门教程》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家基于Zend Framework框架的PHP程序设计有所帮助。