本文實(shí)例講述了Zend Framework中Zend_Db_Table表關(guān)聯(lián)用法。分享給大家參考,具體如下:
介紹:
在RDBMS中,表之間有著各種關(guān)係,有一多對(duì)應(yīng),多多對(duì)應(yīng)等等。
Zend框架提供了一些方法來(lái)方便我們實(shí)現(xiàn)這些關(guān)係。
定義關(guān)係:
下面是本文用的例子的關(guān)係定義:
<?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') ) );
我們看到例子中定義了四個(gè)類別:Accounts,Products,Bugs,BugsProducts。其中Accounts,Products和Bugs是三個(gè)實(shí)體表,而B(niǎo)ugsProducts是關(guān)係表。
我們?cè)賮?lái)分析這三個(gè)實(shí)體,一個(gè)Account有多個(gè)Bug,他們之間是一對(duì)多的關(guān)係,而B(niǎo)ug和Product是多對(duì)多的關(guān)係。
$_dependentTables是一個(gè)與該物件關(guān)聯(lián)的物件名,這裡要注意,要寫(xiě)物件名而不是關(guān)聯(lián)的資料庫(kù)名。
$_referenceMap陣列用來(lái)定義和其他表格的關(guān)係,在這裡可以設(shè)定和那些表有關(guān)係,有什麼樣的關(guān)係。第一個(gè)設(shè)定的是Rule Key,也就是上面例子的'Reporter', 'Engineer'之類的。 Rule Key的作用其實(shí)就是一個(gè)關(guān)係的名字,並不需要跟其他資料庫(kù)表名或是其他物件名稱的名字一樣。只是為了標(biāo)記的,在後面的時(shí)候,我們可以看到這個(gè)Rule Key的作用。
每一個(gè)Rule下面都有以下的一些定義:(沒(méi)有特殊說(shuō)明,都以如上'Reporter'關(guān)係進(jìn)行說(shuō)明)
columns=> 設(shè)定和別的表格關(guān)聯(lián)的字段名,如上的'report_by'就是資料庫(kù)中表Bugs的report_by字段。這裡只有一個(gè)字段,也可以設(shè)定多個(gè)字段。
refTableClass=>用來(lái)設(shè)定與此表發(fā)生關(guān)係的表。這裡要注意,一定使用目標(biāo)表的物件的名字而不是表名字,例子中就和'Account'物件發(fā)生了關(guān)聯(lián)。
refColumns =>設(shè)定發(fā)生聯(lián)繫的表的欄位??梢詫?xiě)多個(gè),如果和多個(gè)欄位發(fā)生聯(lián)繫的話,這裡要和columns對(duì)應(yīng)。這個(gè)設(shè)定其實(shí)是可選的,如果為空,關(guān)聯(lián)欄位會(huì)自動(dòng)被設(shè)定為關(guān)聯(lián)表的主鍵。上面例子中並沒(méi)有使用主鍵作為關(guān)聯(lián)字段,所以手動(dòng)設(shè)定。
onDelete=>可選字段,設(shè)定當(dāng)刪除是的動(dòng)作。
onUpdate=>可選字段,設(shè)定當(dāng)更新表時(shí)的動(dòng)作。
以上定義關(guān)係。
從關(guān)聯(lián)表中取資料:
如果我們已經(jīng)得到了一個(gè)查詢結(jié)果,我們可以透過(guò)一下語(yǔ)句去取得這個(gè)結(jié)果相關(guān)聯(lián)的表的查詢結(jié)果:
$row->findDependentRowset($table, [$rule]);
這個(gè)方法一般使用與一多對(duì)應(yīng)的兩個(gè)實(shí)體表中,在多多對(duì)應(yīng)的兩個(gè)實(shí)體表和一個(gè)關(guān)係表如何從一個(gè)實(shí)體表取出另一個(gè)實(shí)體表的數(shù)據(jù),我們會(huì)在下面敘述。
第一個(gè)欄位$table是指和這個(gè)表想相聯(lián)繫的表格對(duì)應(yīng)的類別名稱。第二個(gè)欄位是可選的,是我們剛剛說(shuō)到的rule key,就是這個(gè)關(guān)係的名字,如果省略,則預(yù)設(shè)為這個(gè)表中的第一個(gè)關(guān)係。以下是範(fàn)例:
<?php $accountsTable = new Accounts(); $accountsRowset = $accountsTable->find(1234); $user1234 = $accountsRowset->current(); $bugsReportedByUser = $user1234->findDependentRowset('Bugs');
範(fàn)例中,我們先讀取了一個(gè)編號(hào)為1234的用戶,然後去尋找這個(gè)傢伙報(bào)了什麼bug,由於zend預(yù)設(shè)是第一個(gè)關(guān)聯(lián),所以這裡和Account發(fā)生關(guān)聯(lián)的第一個(gè)就是'Reporter,所以就取出了Reporter的記錄。
如果我們想取出其他的記錄,例如Engineer,可以按照下面的辦法:
<?php $accountsTable = new Accounts(); $accountsRowset = $accountsTable->find(1234); $user1234 = $accountsRowset->current(); $bugsAssignedToUser = $user1234->findDependentRowset('Bugs', 'Engineer');
除了使用findDependentRowset之外,我們還可以使用叫做「魔術(shù)方法」(Magic Method)的機(jī)制。之所以這麼叫,就是因?yàn)楹孟裨谧兡g(shù)一樣。所以方法findDependentRowset('
- $row->find
- $row->find
註:這個(gè)機(jī)制是我們最一開(kāi)始是在Ruby on Rails裡面看到的。這裡的
<?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();
從父表取得字段:
剛剛我們介紹了一多關(guān)係中的從一去多的方法,現(xiàn)在我們反過(guò)來(lái),從多取一,其實(shí)是從多中的一個(gè)取他相對(duì)應(yīng)的那個(gè)記錄。
類似的我們有這樣的語(yǔ)句:
$row->findParentRow($table, [$rule]);
類似的,$table為類名,而可選參數(shù)$rule填入對(duì)應(yīng)的Rule Key。以下是例子:
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->fetchAll(array('bug_status = ?' => 'NEW')); $bug1 = $bugsRowset->current(); $reporter = $bug1->findParentRow('Accounts');
和上面不太一樣的是,上面回傳的是一個(gè)多個(gè)記錄的集合,而這次回傳的必然是一筆記錄。下面的例子是設(shè)定Rule:
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->fetchAll('bug_status = ?', 'NEW'); $bug1 = $bugsRowset->current(); $engineer = $bug1->findParentRow('Accounts', 'Engineer');
只需要吧Rule填入就好了。相似的,這個(gè)方法也有「魔術(shù)字段」。 findParentRow('
- $row->findParent
- $row->findParent
範(fàn)例:
取得多對(duì)多關(guān)係表的欄位:
上面兩個(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
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門(mén)文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)
