成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

ZendFramework之Zend_Db_Table表關(guān)聯(lián)的示例分析-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān)Zend Framework之Zend_Db_Table表關(guān)聯(lián)的示例分析的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

創(chuàng)新互聯(lián)公司從2013年成立,先為鄧州等服務(wù)建站,鄧州等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為鄧州企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wè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í)體表,而BugsProducts是關(guān)系表。

我們?cè)賮?lái)分析一下這三個(gè)實(shí)體,一個(gè)Account有多個(gè)Bug,他們之間是一對(duì)多的關(guān)系,而Bug和Product是多對(duì)多的關(guān)系。

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

$_referenceMap數(shù)組用來(lái)定義和其他表的關(guān)系,在這里可以設(shè)置和那些表有關(guān)系,有什么樣的關(guān)系。第一個(gè)設(shè)置的是Rule Key,也就是上面例子的'Reporter', 'Engineer'之類的。Rule Key的作用其實(shí)就是一個(gè)關(guān)系的名字,并不需要和其他數(shù)據(jù)庫(kù)表名或者其他對(duì)象名的名字一樣。只是為了標(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'就是數(shù)據(jù)庫(kù)中表Bugs的report_by字段。這里只有一個(gè)字段,也可以設(shè)置多個(gè)字段。

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

refColumns =>設(shè)置發(fā)生聯(lián)系的表的字段。可以寫多個(gè),如果和多個(gè)字段發(fā)生聯(lián)系的話,這里要和columns對(duì)應(yīng)。這個(gè)設(shè)置其實(shí)是可選的,如果為空,關(guān)聯(lián)字段自動(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)表中取數(shù)據(jù):

如果我們已經(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)系的名字,如果省略,則默認(rèn)為這個(gè)表中的第一個(gè)關(guān)系。下面是例子:

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

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

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

注:這個(gè)機(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)在我們反過(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('<TableClass>', '<Rule>')對(duì)應(yīng):

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

例子:

取得多對(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('<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();

感謝各位的閱讀!關(guān)于“Zend Framework之Zend_Db_Table表關(guān)聯(lián)的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

網(wǎng)站題目:ZendFramework之Zend_Db_Table表關(guān)聯(lián)的示例分析-創(chuàng)新互聯(lián)
路徑分享:http://jinyejixie.com/article32/hgopc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、網(wǎng)站改版、App設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)公司品牌網(wǎng)站制作、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)
阜新| 辽中县| 云阳县| 台江县| 友谊县| 元谋县| 手游| 巢湖市| 连平县| 武安市| 丹阳市| 辽阳市| 松阳县| 望都县| 麦盖提县| 库伦旗| 桦南县| 广宗县| 南郑县| 尼木县| 建始县| 石楼县| 府谷县| 涟源市| 方正县| 拉萨市| 南和县| 新密市| 思南县| 翁牛特旗| 谢通门县| 兴业县| 吉木乃县| 靖安县| 富顺县| 中宁县| 南安市| 梓潼县| 洪雅县| 桃园市| 进贤县|