《PHP學習:Zend Framework教程之Zend_Db_Table表關聯實例詳解》要點:
本文介紹了PHP學習:Zend Framework教程之Zend_Db_Table表關聯實例詳解,希望對您有用。如果有疑問,可以聯系我們。
本文實例講述了Zend Framework中Zend_Db_Table表關聯用法.分享給大家供大家參考,具體如下:PHP學習
介紹:PHP學習
在RDBMS中,表之間有著各種關系,有一多對應,多多對應等等.PHP學習
Zend框架提供了一些辦法來方便我們實現這些關系.PHP學習
定義關系:PHP學習
下面是本文用的例子的關系定義:PHP學習
<?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.其中Accounts,Products和Bugs是三個實體表,而BugsProducts是關系表.PHP學習
我們再來分析一下這三個實體,一個Account有多個Bug,他們之間是一對多的關系,而Bug和Product是多對多的關系.PHP學習
$_dependentTables是一個與該對象關聯的對象名,這里注意,要寫對象名而不是關聯的數據庫名.PHP學習
$_referenceMap數組用來定義和其他表的關系,在這里可以設置和那些表有關系,有什么樣的關系.第一個設置的是Rule Key,也就是上面例子的'Reporter', 'Engineer'之類的.Rule Key的作用其實就是一個關系的名字,并不需要和其他數據庫表名或者其他對象名的名字一樣.只是為了標記的,在后面的時候,我們可以看到這個Rule Key的作用.PHP學習
每一個Rule下面都有如下的一些定義:(沒有特殊說明,都以如上'Reporter'關系進行說明)PHP學習
columns=> 設置和別的表關聯的字段名,如上的'report_by'就是數據庫中表Bugs的report_by字段.這里只有一個字段,也可以設置多個字段.PHP學習
refTableClass=>用于設置與這個表發生關系的表.這里要注意,一定使用目標表的對象的名字而不是表名字,例子中就和'Account'對象發生了關聯.PHP學習
refColumns =>設置發生聯系的表的字段.可以寫多個,如果和多個字段發生聯系的話,這里要和columns對應.這個設置其實是可選的,如果為空,關聯字段自動被設置成為關聯表的主鍵.上面例子中并沒有使用主鍵作為關聯字段,所以手動設置.PHP學習
onDelete=>可選字段,設置當刪除是的動作.
onUpdate=>可選字段,設置當更新表時的動作.PHP學習
以上定義關系.PHP學習
從關聯表中取數據:PHP學習
如果我們已經得到了一個查詢結果,我們可以通過一下語句去取得這個結果相關聯的表的查詢結果:PHP學習
$row->findDependentRowset($table, [$rule]);
這個辦法一般使用與一多對應的兩個實體表中,在多多對應的兩個實體表和一個關系表如何從一個實體表取出另一個實體表的數據,我們會在下面敘述.PHP學習
第一個字段$table是指和這個表想相聯系的表對應的類名.第二個字段是可選的,是我們剛剛說到的rule key,就是這個關系的名字,如果省略,則默認為這個表中的第一個關系.下面是例子:PHP學習
<?php $accountsTable = new Accounts(); $accountsRowset = $accountsTable->find(1234); $user1234 = $accountsRowset->current(); $bugsReportedByUser = $user1234->findDependentRowset('Bugs');
例子中,我們先讀取了一個編號為1234的用戶,然后去查找這個家伙報了什么bug,由于zend默認是第一個關聯,所以這里和Account發生關聯的第一個就是'Reporter,所以就取出了Reporter的記錄.PHP學習
如果我們想取出其他的記錄,比如Engineer,可以依照下面的辦法:PHP學習
<?php $accountsTable = new Accounts(); $accountsRowset = $accountsTable->find(1234); $user1234 = $accountsRowset->current(); $bugsAssignedToUser = $user1234->findDependentRowset('Bugs', 'Engineer');
除了使用findDependentRowset之外,我們還可以使用叫做“魔術辦法”(Magic Method)的機制.之所以這么叫,就是因為好像是在變魔術一樣.所以辦法findDependentRowset('<TableClass>', '<Rule>')就可以等價于如下:PHP學習
- $row->find<TableClass>()
- $row->find<TableClass>By<Rule>()PHP學習
注:這個機制是我們最一開始是在Ruby on Rails里面看到的.這里的<TableClass>和<Rule>一定要使用和相關聯的類名以及關聯名(Rule Key)完全一樣的名字,才可以生效.下面是例子:PHP學習
<?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();
從父表取得字段:PHP學習
剛剛我們介紹了一多關系中的從一去多的辦法,現在我們反過來,從多取一,其實是從多中的一個取他相對應的那個記錄.PHP學習
類似的我們有這樣的語句:PHP學習
$row->findParentRow($table, [$rule]);
類似的,$table為類名,而可選參數$rule填入對應的Rule Key.下面是例子:PHP學習
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->fetchAll(array('bug_status = ?' => 'NEW')); $bug1 = $bugsRowset->current(); $reporter = $bug1->findParentRow('Accounts');
和上面不太一樣的是,上面返回的是一個多個記錄的集合,而這次返回的必然是一條記錄.下面的例子是設置Rule:PHP學習
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->fetchAll('bug_status = ?', 'NEW'); $bug1 = $bugsRowset->current(); $engineer = $bug1->findParentRow('Accounts', 'Engineer');
只需要吧Rule填入就好了.相似的,這個辦法也有“魔術字段”.findParentRow('<TableClass>', '<Rule>')對應:PHP學習
- $row->findParent<TableClass>()
- $row->findParent<TableClass>By<Rule>()PHP學習
例子:PHP學習
取得多對多關系表的字段:PHP學習
上面兩個辦法講述了一對多的使用,下面就是多對多了.我們使用如下辦法取得多對多關系表的數據:PHP學習
$row->findManyToManyRowset($table, $intersectionTable, [$rule1, [$rule2]]);
這里參數變成了4個,因為需要增加一個關系表來存儲多對多的關系.PHP學習
$table是與之發生多對多關系的表的類名,$intersectionTable是中間存儲關系的關系表的類名.$rule1和$rule2是上面兩個數據表的Rule Key.省略Rule Key的例子如下:PHP學習
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->find(1234); $bug1234 = $bugsRowset->current(); $productsRowset = $bug1234->findManyToManyRowset('Products', 'BugsProducts');
下面是該辦法的全部參數調用例子:PHP學習
<?php $bugsTable = new Bugs(); $bugsRowset = $bugsTable->find(1234); $bug1234 = $bugsRowset->current(); $productsRowset = $bug1234->findManyToManyRowset('Products', 'BugsProducts', 'Bug');
這次的“魔術辦法”是,對應 findManyToManyRowset('<TableClass>', '<IntersectionTableClass>', '<Rule1>', '<Rule2>')
- $row->find<TableClass>Via<IntersectionTableClass>()
- $row->find<TableClass>Via<IntersectionTableClass>By<Rule1>()
- $row->find<TableClass>Via<IntersectionTableClass>By<Rule1>And<Rule2>()PHP學習
例子:PHP學習
<?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常見數據庫操作技巧匯總》PHP學習
希望本文所述對大家基于Zend Framework框架的PHP程序設計有所贊助.PHP學習
《PHP學習:Zend Framework教程之Zend_Db_Table表關聯實例詳解》是否對您有啟發,歡迎查看更多與《PHP學習:Zend Framework教程之Zend_Db_Table表關聯實例詳解》相關教程,學精學透。維易PHP學院為您提供精彩教程。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/7255.html