この記事の例では、Zend Framework での Zend_Db_Table テーブル関連付けの使用法について説明します。參考のために皆さんと共有してください。詳細(xì)は次のとおりです:
はじめに:
RDBMS では、テーブル間のさまざまな関係、一対多対応、多対多対応などがあります。
Zend フレームワークは、これらの関係の実裝を容易にするいくつかのメソッドを提供します。
関係の定義:
この記事で使用される例の関係定義は次のとおりです:
<?php class Accounts extends Zend_Db_Table_Abstract { protected $_name = 'accounts'; protected $_dependentTables = array('Bugs'); } class class protected protected class protected } Products extends Zend_Db_Table_Abstract { protected $_name = 'products'; protected $_dependentTables = array('BugsProducts'); } Bugs extends Zend_Db_Table_Abstract { protected $_name = 'bugs';$_dependentTables = array('BugsProducts');$_referenceMap = array( 'Reporter' => array( 'columns' => 'reported_by', 'refTableClass' => 'Accounts', 'refColumns' => 'account_name' ), 'Engineer' => array( 'columns' => 'assigned_to', 'refTableClass' => 'Accounts', 'refColumns' => 'account_name' ), 'Verifier' => array( 'columns' => array('verified_by'), 'refTableClass' => 'Accounts', 'refColumns' => array('account_name') ) ); } BugsProducts extends Zend_Db_Table_Abstract { protected $_name = 'bugs_products';$_referenceMap = array( 'Bug' => array( 'columns' => array('bug_id'), 'refTableClass' => 'Bugs', 'refColumns' => array('bug_id') ), 'Product' => array( 'columns' => array('product_id'), 'refTableClass' => 'Products', 'refColumns' => array('product_id') ) );
この例では、Accounts、Products、Bugs、BugsProducts の 4 つのクラスが定義されていることがわかります。このうち、Accounts、Products、および Bugs は 3 つのエンティティ テーブルであり、BugsProducts はリレーションシップ テーブルです。
これら 3 つのエンティティをもう一度分析してみましょう。アカウントには複數(shù)のバグがあり、それらの間には 1 対多の関係がありますが、バグと製品には多対多の関係があります。
$_dependentTables は、オブジェクトに関連付けられたオブジェクト名です。ここでは、関連付けられたデータベース名の代わりにオブジェクト名を記述する必要があります。
$_referenceMap 配列は、他のテーブルとの関係を定義するために使用され、それらのテーブルとの関係と、そこにどのような関係があるかを設(shè)定できます。最初に設(shè)定するのはルールキーで、上記の例では「Reporter」や「Engineer」などです。ルール キーの機(jī)能は実際にはリレーションシップの名前であり、他のデータベース テーブル名や他のオブジェクト名と同じである必要はありません。マーキングのためだけに、このルール キーの役割は後で確認(rèn)できます。
各ルールには次の定義があります: (特別な指示はありません。すべては上記の「レポーター」関係で説明されています)
columns=> 他のテーブルに関連付けられたフィールド名を設(shè)定します。上記の 'report_by' は次のとおりです。テーブルの report_by フィールド データベース內(nèi)のバグ。ここではフィールドは 1 つだけですが、複數(shù)のフィールドを設(shè)定することもできます。
refTableClass=> は、このテーブルに関連するテーブルを設(shè)定するために使用されます。この例では、テーブル名ではなく、ターゲット テーブル オブジェクトの名前を使用する必要があることに注意してください。
refColumns =>コンタクトが発生するテーブルのフィールドを設(shè)定します。複數(shù)のフィールドに関連する場(chǎng)合は、複數(shù)の列に対応する必要があります。この設(shè)定は実際にはオプションです??栅螆?chǎng)合、関連フィールドは関連テーブルの主キーとして自動(dòng)的に設(shè)定されます。上記の例では、主キーは関連フィールドとして使用されないため、手動(dòng)で設(shè)定されます。
onDelete=> オプションのフィールドで、削除時(shí)のアクションを設(shè)定します。
onUpdate=> オプションのフィールドで、テーブルを更新するときのアクションを設(shè)定します。
上記は関係を定義します。
関連テーブルからデータを取得します:
すでにクエリ結(jié)果を取得している場(chǎng)合は、次のステートメントを通じてこの結(jié)果に関連付けられたテーブルのクエリ結(jié)果を取得できます:
$row->findDependentRowset($table, [$rule]);
このメソッドは通常、1 と 2 に対応する 2 を使用します。多くのエンティティ テーブルのうち、Duoduo の 2 つの対応するエンティティ テーブルと 1 つのリレーションシップ テーブル內(nèi)の 1 つのエンティティ テーブルと別のエンティティ テーブルからデータを取得する方法について説明します。
最初のフィールド $table は、このテーブルが関連付けられているテーブルに対応するクラス名を參照します。 2 番目のフィールドはオプションであり、先ほど述べたルール キーであり、省略した場(chǎng)合は、テーブル內(nèi)の最初のリレーションシップがデフォルトになります。以下は例です:
<?php $accountsTable = new Accounts(); $accountsRowset = $accountsTable->find(1234); $user1234 = $accountsRowset->current(); $bugsReportedByUser = $user1234->findDependentRowset('Bugs');
この例では、まず 1234 という番號(hào)のユーザーを読み取り、次にこの人が報(bào)告したバグを調(diào)べました。デフォルトでは zend が最初の関連付けであるため、これがアカウントに関連付けられた最初の関連付けになります。 1 つ目は「Reporter」です。そこで、Reporter の記録を取り出しました。
Engineer などの他のレコードを取り出したい場(chǎng)合は、次のメソッドに従うことができます:
<?php $accountsTable = new Accounts(); $accountsRowset = $accountsTable->find(1234); $user1234 = $accountsRowset->current(); $bugsAssignedToUser = $user1234->findDependentRowset('Bugs', 'Engineer');
findDependentRowset を使用することに加えて、「Magic Method」と呼ばれる仕組みを使用することもできます。なぜそう呼ばれるかというと、手品のようなものだからです。したがって、メソッド findDependentRowset('
- $row->find
- $row->find
注: このメカニズムは Ruby on Rails で初めて見(jiàn)られました。ここでの
<?php $accountsTable = new Accounts(); $accountsRowset = $accountsTable->find(1234); $user1234 = $accountsRowset->current(); // Use the default reference rule $bugsReportedBy = $user1234->findBugs();// Specify the reference rule $bugsAssignedTo = $user1234->findBugsByEngineer();
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->fetchAll('bug_status = ?', 'NEW'); $bug1 = $bugsRowset->current(); // Use the default reference rule $reporter = $bug1->findParentAccounts();// Specify the reference rule $engineer = $bug1->findParentAccountsByEngineer();
親テーブルからフィールドを取得します:
先ほど、1 対多の関係で 1 から多への取得方法を紹介しました。今度は、逆に、多から 1 を取得します。 、対応する多數(shù)のレコードの 1 つから取得します。
同様に、次のようなステートメントがあります:
$row->findParentRow($table, [$rule]);
同様に、$table はクラス名で、オプションのパラメーター $rule には対応するルール キーが入力されます。以下は例です:
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->fetchAll(array('bug_status = ?' => 'NEW')); $bug1 = $bugsRowset->current(); $reporter = $bug1->findParentRow('Accounts');
上記と異なるのは、上記で返されるのは複數(shù)のレコードの集合であり、今回返されるのは 1 つのレコードである必要があることです。次の例はルールを設(shè)定する例です:
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->fetchAll('bug_status = ?', 'NEW'); $bug1 = $bugsRowset->current(); $engineer = $bug1->findParentRow('Accounts', 'Engineer');
ルールを入力するだけです。同様に、このメソッドにも「魔法のフィールド」があります。 findParentRow('
- $row->findParent
- $row->findParent
例:
多対多の関係テーブルのフィールドを取得します:
上面兩個(gè)方法講述了一對(duì)多的使用,下面就是多對(duì)多了。我們使用如下方法取得多對(duì)多關(guān)系表的數(shù)據(jù):
$row->findManyToManyRowset($table, $intersectionTable, [$rule1, [$rule2]]);
這里參數(shù)變成了4個(gè),因?yàn)樾枰黾右粋€(gè)關(guān)系表來(lái)存儲(chǔ)多對(duì)多的關(guān)系。
$table是與之發(fā)生多對(duì)多關(guān)系的表的類名,$intersectionTable是中間存儲(chǔ)關(guān)系的關(guān)系表的類名。$rule1和$rule2是上面兩個(gè)數(shù)據(jù)表的Rule Key。省略Rule Key的例子如下:
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->find(1234); $bug1234 = $bugsRowset->current(); $productsRowset = $bug1234->findManyToManyRowset('Products', 'BugsProducts');
下面是該方法的全部參數(shù)調(diào)用例子:
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->find(1234); $bug1234 = $bugsRowset->current(); $productsRowset = $bug1234->findManyToManyRowset('Products', 'BugsProducts', 'Bug');
這次的“魔術(shù)方法”是,對(duì)應(yīng) 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();
希望本文所述對(duì)大家基于Zend Framework框架的PHP程序設(shè)計(jì)有所幫助。
更多Zend Framework教程之Zend_Db_Table表關(guān)聯(lián)實(shí)例詳解相關(guān)文章請(qǐng)關(guān)注PHP中文網(wǎng)!

ホットAIツール

Undress AI Tool
脫衣畫像を無(wú)料で

Undresser.AI Undress
リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover
寫真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無(wú)料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無(wú)料のコードエディター

SublimeText3 中國(guó)語(yǔ)版
中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1
強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)