亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

Zend Framework教程之Zend_Db_Table表關聯實例詳解

2024-05-04 23:44:19
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Zend Framework教程之Zend_Db_Table表關聯用法,結合實例形式較為詳細的分析了Zend_Db_Table表關聯的定義,實現方法與相關注意事項,需要的朋友可以參考下
 

本文實例講述了Zend Framework中Zend_Db_Table表關聯用法。分享給大家供大家參考,具體如下:

介紹:

在RDBMS中,表之間有著各種關系,有一多對應,多多對應等等。

Zend框架提供了一些方法來方便我們實現這些關系。

定義關系:

下面是本文用的例子的關系定義:

<?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是三個實體表,而BugsProducts是關系表。

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

$_dependentTables是一個與該對象關聯的對象名,這里注意,要寫對象名而不是關聯的數據庫名。

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

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

columns=> 設置和別的表關聯的字段名,如上的'report_by'就是數據庫中表Bugs的report_by字段。這里只有一個字段,也可以設置多個字段。

refTableClass=>用于設置與這個表發生關系的表。這里要注意,一定使用目標表的對象的名字而不是表名字,例子中就和'Account'對象發生了關聯。

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

onDelete=>可選字段,設置當刪除是的動作。
onUpdate=>可選字段,設置當更新表時的動作。

以上定義關系。

從關聯表中取數據:

如果我們已經得到了一個查詢結果,我們可以通過一下語句去取得這個結果相關聯的表的查詢結果:

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

這個方法一般使用與一多對應的兩個實體表中,在多多對應的兩個實體表和一個關系表如何從一個實體表取出另一個實體表的數據,我們會在下面敘述。

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

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

例子中,我們先讀取了一個編號為1234的用戶,然后去查找這個家伙報了什么bug,由于zend默認是第一個關聯,所以這里和Account發生關聯的第一個就是'Reporter,所以就取出了Reporter的記錄。

如果我們想取出其他的記錄,比如Engineer,可以按照下面的辦法:

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

除了使用findDependentRowset之外,我們還可以使用叫做“魔術方法”(Magic Method)的機制。之所以這么叫,就是因為好像是在變魔術一樣。所以方法findDependentRowset('<TableClass>', '<Rule>')就可以等價于如下:

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

注:這個機制是我們最一開始是在Ruby on Rails里面看到的。這里的<TableClass>和<Rule>一定要使用和相關聯的類名以及關聯名(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();

從父表取得字段:

剛剛我們介紹了一多關系中的從一去多的方法,現在我們反過來,從多取一,其實是從多中的一個取他相對應的那個記錄。

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

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

類似的,$table為類名,而可選參數$rule填入對應的Rule Key。下面是例子:

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

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

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

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

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

例子:

取得多對多關系表的字段:

上面兩個方法講述了一對多的使用,下面就是多對多了。我們使用如下方法取得多對多關系表的數據:

$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('<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();
 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
狠狠色狠狠色综合日日五| 欧美精品免费在线观看| 国模吧一区二区| www.国产一区| 久久国产精品免费视频| 午夜精品视频在线| 色婷婷综合成人| 欧美激情视频网| 久久精品青青大伊人av| 亚洲精品av在线| 亚洲国产精品成人av| 日韩精品一区二区三区第95| 国产在线精品播放| 日日噜噜噜夜夜爽亚洲精品| 欧美理论电影在线观看| 国产精品h片在线播放| 欧美日本黄视频| 国产精品影片在线观看| 久久久久一本一区二区青青蜜月| 久久久久久久成人| 亚洲国产精品久久久久秋霞蜜臀| 久久久国产91| 成人字幕网zmw| 日韩av综合网| 人体精品一二三区| **欧美日韩vr在线| xxxx欧美18另类的高清| 美日韩精品免费观看视频| 国产精品国产自产拍高清av水多| 国产小视频91| 青青草原一区二区| 久久久久亚洲精品| 欧美激情一区二区三区在线视频观看| 久久精品一偷一偷国产| 国产女人精品视频| 亚洲一二在线观看| 国产区精品在线观看| 色偷偷9999www| 韩剧1988免费观看全集| 一区二区亚洲欧洲国产日韩| 国产精品永久免费在线| 亚洲人成电影网| 国产视频福利一区| 欧美视频免费在线观看| 川上优av一区二区线观看| 亚洲色图在线观看| 亚洲欧美综合另类中字| 97久久精品国产| 欧美日韩视频免费播放| 日韩中文字幕在线| 欧美午夜www高清视频| 91精品久久久久久久久不口人| 黄色成人在线播放| 国产精品视频免费在线| 亚洲精品动漫100p| 成人欧美一区二区三区在线| 亚洲视频专区在线| 国产欧美一区二区三区在线看| 91超碰caoporn97人人| 久久影院中文字幕| 欧美视频在线观看免费| 国产色综合天天综合网| 久久久久亚洲精品国产| 久久久综合av| 奇米一区二区三区四区久久| 日韩国产中文字幕| 国产精品ⅴa在线观看h| 国产美女91呻吟求| 成人精品在线观看| 久久视频在线看| 在线国产精品播放| 日韩精品极品毛片系列视频| 中文字幕日韩有码| 国产精品久久一区主播| 在线日韩中文字幕| 精品国产依人香蕉在线精品| 黄色精品一区二区| 亚洲欧洲自拍偷拍| 亚洲精品国偷自产在线99热| 成人在线视频网| 亚洲一区中文字幕在线观看| 色妞一区二区三区| 欧美黑人性视频| 久久综合久久美利坚合众国| 久久久久久国产三级电影| 992tv成人免费影院| 国产精品久久久久国产a级| 日韩欧美第一页| 亚洲高清不卡av| 精品国产精品自拍| 在线性视频日韩欧美| 国产精品欧美亚洲777777| 国产精品一区二区性色av| 欧美激情videoshd| 中文字幕日韩欧美精品在线观看| 久久精品影视伊人网| 美女少妇精品视频| 亚洲国产精品热久久| 色悠悠久久88| 精品美女久久久久久免费| 这里只有精品视频在线| 自拍偷拍免费精品| 欧美国产一区二区三区| 国产精品久久久久av免费| 精品视频一区在线视频| 亚洲影院色无极综合| 免费91在线视频| 欧美日韩免费区域视频在线观看| 亚洲欧美一区二区三区情侣bbw| 亚洲欧美三级在线| 韩日精品中文字幕| 亚州国产精品久久久| 国产精自产拍久久久久久| 日韩欧美中文免费| 久久精品电影一区二区| 精品激情国产视频| 色偷偷av亚洲男人的天堂| 国产一区二区三区四区福利| 91在线视频免费| 久久综合久久美利坚合众国| 538国产精品一区二区在线| 久久久精品国产一区二区| 中文字幕在线日韩| 一区二区三区国产视频| 国产区精品在线观看| 久久成人人人人精品欧| 亚洲国产天堂久久综合| 91精品国产高清久久久久久| 亚洲欧洲免费视频| 久久久久国产精品免费网站| 亚洲国产日韩欧美在线动漫| 欧美大片在线看| 7777免费精品视频| 国产亚洲人成a一在线v站| 成人在线免费观看视视频| 久久久电影免费观看完整版| 国产女同一区二区| 成人啪啪免费看| 97国产精品久久| 国产欧美日韩丝袜精品一区| 欧美野外wwwxxx| 中文字幕亚洲欧美在线| 欧美成人精品一区二区三区| 欧美激情一区二区三区高清视频| 国产亚洲精品综合一区91| 国产精品露脸自拍| 日韩在线视频观看正片免费网站| 欧美多人乱p欧美4p久久| 一区国产精品视频| 国产精品狼人色视频一区| 国产欧美精品久久久| 国产亚洲欧洲黄色| 国产精品久久久久久久久久免费| 国产精品久久久久999| 欧美国产日韩一区| 国产在线不卡精品| 亚洲福利在线视频| 成人羞羞国产免费| 91精品久久久久久久久久入口| 欧美野外wwwxxx| 日韩av一区在线| 欧美日韩激情美女| 亚洲一区二区三区成人在线视频精品| 亚洲第一网中文字幕|