国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > PHP > 正文

Zend Framework教程之Zend_Db_Table表關(guān)聯(lián)實(shí)例詳解

2024-05-04 23:44:19
字體:
供稿:網(wǎng)友
這篇文章主要介紹了Zend Framework教程之Zend_Db_Table表關(guān)聯(lián)用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Zend_Db_Table表關(guān)聯(lián)的定義,實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
 

本文實(shí)例講述了Zend Framework中Zend_Db_Table表關(guān)聯(lián)用法。分享給大家供大家參考,具體如下:

介紹:

在RDBMS中,表之間有著各種關(guān)系,有一多對應(yīng),多多對應(yīng)等等。

Zend框架提供了一些方法來方便我們實(shí)現(xiàn)這些關(guān)系。

定義關(guān)系:

下面是本文用的例子的關(guān)系定義:

<?phpclass Accounts extends Zend_Db_Table_Abstract{  protected $_name      = 'accounts';  protected $_dependentTables = array('Bugs');}classclass  protected  protectedclass  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是三個實(shí)體表,而BugsProducts是關(guān)系表。

我們再來分析一下這三個實(shí)體,一個Account有多個Bug,他們之間是一對多的關(guān)系,而Bug和Product是多對多的關(guān)系。

$_dependentTables是一個與該對象關(guān)聯(lián)的對象名,這里注意,要寫對象名而不是關(guān)聯(lián)的數(shù)據(jù)庫名。

$_referenceMap數(shù)組用來定義和其他表的關(guān)系,在這里可以設(shè)置和那些表有關(guān)系,有什么樣的關(guān)系。第一個設(shè)置的是Rule Key,也就是上面例子的'Reporter', 'Engineer'之類的。Rule Key的作用其實(shí)就是一個關(guān)系的名字,并不需要和其他數(shù)據(jù)庫表名或者其他對象名的名字一樣。只是為了標(biāo)記的,在后面的時候,我們可以看到這個Rule Key的作用。

每一個Rule下面都有如下的一些定義:(沒有特殊說明,都以如上'Reporter'關(guān)系進(jìn)行說明)

columns=> 設(shè)置和別的表關(guān)聯(lián)的字段名,如上的'report_by'就是數(shù)據(jù)庫中表Bugs的report_by字段。這里只有一個字段,也可以設(shè)置多個字段。

refTableClass=>用于設(shè)置與這個表發(fā)生關(guān)系的表。這里要注意,一定使用目標(biāo)表的對象的名字而不是表名字,例子中就和'Account'對象發(fā)生了關(guān)聯(lián)。

refColumns =>設(shè)置發(fā)生聯(lián)系的表的字段??梢詫懚鄠€,如果和多個字段發(fā)生聯(lián)系的話,這里要和columns對應(yīng)。這個設(shè)置其實(shí)是可選的,如果為空,關(guān)聯(lián)字段自動被設(shè)置成為關(guān)聯(lián)表的主鍵。上面例子中并沒有使用主鍵作為關(guān)聯(lián)字段,所以手動設(shè)置。

onDelete=>可選字段,設(shè)置當(dāng)刪除是的動作。
onUpdate=>可選字段,設(shè)置當(dāng)更新表時的動作。

以上定義關(guān)系。

從關(guān)聯(lián)表中取數(shù)據(jù):

如果我們已經(jīng)得到了一個查詢結(jié)果,我們可以通過一下語句去取得這個結(jié)果相關(guān)聯(lián)的表的查詢結(jié)果:

$row->findDependentRowset($table, [$rule]);

這個方法一般使用與一多對應(yīng)的兩個實(shí)體表中,在多多對應(yīng)的兩個實(shí)體表和一個關(guān)系表如何從一個實(shí)體表取出另一個實(shí)體表的數(shù)據(jù),我們會在下面敘述。

第一個字段$table是指和這個表想相聯(lián)系的表對應(yīng)的類名。第二個字段是可選的,是我們剛剛說到的rule key,就是這個關(guān)系的名字,如果省略,則默認(rèn)為這個表中的第一個關(guān)系。下面是例子:

<?php$accountsTable   = new Accounts();$accountsRowset   = $accountsTable->find(1234);$user1234      = $accountsRowset->current();$bugsReportedByUser = $user1234->findDependentRowset('Bugs');

例子中,我們先讀取了一個編號為1234的用戶,然后去查找這個家伙報(bào)了什么bug,由于zend默認(rèn)是第一個關(guān)聯(lián),所以這里和Account發(fā)生關(guān)聯(lián)的第一個就是'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('<TableClass>', '<Rule>')就可以等價于如下:

- $row->find<TableClass>()
- $row->find<TableClass>By<Rule>()

注:這個機(jī)制是我們最一開始是在Ruby on Rails里面看到的。這里的<TableClass>和<Rule>一定要使用和相關(guān)聯(lián)的類名以及關(guān)聯(lián)名(Rule Key)完全一樣的名字,才可以生效。下面是例子:

<?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)在我們反過來,從多取一,其實(shí)是從多中的一個取他相對應(yīng)的那個記錄。

類似的我們有這樣的語句:

$row->findParentRow($table, [$rule]);

類似的,$table為類名,而可選參數(shù)$rule填入對應(yīng)的Rule Key。下面是例子:

<?php$bugsTable     = new Bugs();$bugsRowset    = $bugsTable->fetchAll(array('bug_status = ?' => 'NEW'));$bug1       = $bugsRowset->current();$reporter     = $bug1->findParentRow('Accounts');

和上面不太一樣的是,上面返回的是一個多個記錄的集合,而這次返回的必然是一條記錄。下面的例子是設(shè)置Rule:

<?php$bugsTable     = new Bugs();$bugsRowset    = $bugsTable->fetchAll('bug_status = ?', 'NEW');$bug1       = $bugsRowset->current();$engineer     = $bug1->findParentRow('Accounts', 'Engineer');

只需要吧Rule填入就好了。相似的,這個方法也有“魔術(shù)字段”。findParentRow('<TableClass>', '<Rule>')對應(yīng):

- $row->findParent<TableClass>()
- $row->findParent<TableClass>By<Rule>()

例子:

取得多對多關(guān)系表的字段:

上面兩個方法講述了一對多的使用,下面就是多對多了。我們使用如下方法取得多對多關(guān)系表的數(shù)據(jù):

$row->findManyToManyRowset($table, $intersectionTable, [$rule1, [$rule2]]);

這里參數(shù)變成了4個,因?yàn)樾枰黾右粋€關(guān)系表來存儲多對多的關(guān)系。

$table是與之發(fā)生多對多關(guān)系的表的類名,$intersectionTable是中間存儲關(guān)系的關(guān)系表的類名。$rule1和$rule2是上面兩個數(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ù)方法”是,對應(yīng) 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$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();
 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 淄博市| 松原市| 嘉义市| 通化县| 景德镇市| 罗平县| 资中县| 东兰县| 太康县| 广南县| 浙江省| 黑水县| 夏津县| 专栏| 闻喜县| 华宁县| 扶风县| 深泽县| 瑞安市| 泗洪县| 融水| 三台县| 广德县| 当雄县| 云霄县| 女性| 灵川县| 泗阳县| 江陵县| 大同市| 清远市| 荣昌县| 连南| 乌恰县| 陕西省| 汾阳市| 渭南市| 萝北县| 仁寿县| 富民县| 台中市|