国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) php教程 PHP開(kāi)發(fā) Zend Framework教學(xué)之Zend_Db_Table表關(guān)聯(lián)實(shí)例詳解

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

Jan 05, 2017 am 09:40 AM

本文實(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      = &#39;accounts&#39;;
  protected $_dependentTables = array(&#39;Bugs&#39;);
}
class
class
  protected
  protected
class
  protected
}
Products extends Zend_Db_Table_Abstract
{
  protected $_name      = &#39;products&#39;;
  protected $_dependentTables = array(&#39;BugsProducts&#39;);
}
Bugs extends Zend_Db_Table_Abstract
{
  protected $_name      = &#39;bugs&#39;;$_dependentTables = array(&#39;BugsProducts&#39;);$_referenceMap  = array(
    &#39;Reporter&#39; => array(
      &#39;columns&#39;      => &#39;reported_by&#39;,
      &#39;refTableClass&#39;   => &#39;Accounts&#39;,
      &#39;refColumns&#39;    => &#39;account_name&#39;
    ),
    &#39;Engineer&#39; => array(
      &#39;columns&#39;      => &#39;assigned_to&#39;,
      &#39;refTableClass&#39;   => &#39;Accounts&#39;,
      &#39;refColumns&#39;    => &#39;account_name&#39;
    ),
    &#39;Verifier&#39; => array(
      &#39;columns&#39;      => array(&#39;verified_by&#39;),
      &#39;refTableClass&#39;   => &#39;Accounts&#39;,
      &#39;refColumns&#39;    => array(&#39;account_name&#39;)
    )
  );
}
BugsProducts extends Zend_Db_Table_Abstract
{
  protected $_name = &#39;bugs_products&#39;;$_referenceMap  = array(
    &#39;Bug&#39; => array(
      &#39;columns&#39;      => array(&#39;bug_id&#39;),
      &#39;refTableClass&#39;   => &#39;Bugs&#39;,
      &#39;refColumns&#39;    => array(&#39;bug_id&#39;)
    ),
    &#39;Product&#39; => array(
      &#39;columns&#39;      => array(&#39;product_id&#39;),
      &#39;refTableClass&#39;   => &#39;Products&#39;,
      &#39;refColumns&#39;    => array(&#39;product_id&#39;)
    )
  );

我們看到例子中定義了四個(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(&#39;Bugs&#39;);

範(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(&#39;Bugs&#39;, &#39;Engineer&#39;);

除了使用findDependentRowset之外,我們還可以使用叫做「魔術(shù)方法」(Magic Method)的機(jī)制。之所以這麼叫,就是因?yàn)楹孟裨谧兡g(shù)一樣。所以方法findDependentRowset('', '')就可以等價(jià)於如下:

- $row->find()
- $row->findBy ()

註:這個(gè)機(jī)制是我們最一開(kāi)始是在Ruby on Rails裡面看到的。這裡的一定要使用和相關(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(&#39;bug_status = ?&#39;, &#39;NEW&#39;);
$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(&#39;bug_status = ?&#39; => &#39;NEW&#39;));
$bug1       = $bugsRowset->current();
$reporter     = $bug1->findParentRow(&#39;Accounts&#39;);

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

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

只需要吧Rule填入就好了。相似的,這個(gè)方法也有「魔術(shù)字段」。 findParentRow('', '')對(duì)應(yīng):

- $row->findParent()
- $row->findParentBy()

範(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(&#39;Products&#39;, &#39;BugsProducts&#39;);

下面是該方法的全部參數(shù)調(diào)用例子:

<?php
$bugsTable    = new Bugs();
$bugsRowset    = $bugsTable->find(1234);
$bug1234     = $bugsRowset->current();
$productsRowset  = $bug1234->findManyToManyRowset(&#39;Products&#39;, &#39;BugsProducts&#39;, &#39;Bug&#39;);

這次的“魔術(shù)方法”是,對(duì)應(yīng) findManyToManyRowset('', '', '', '')
- $row->findVia()
- $row->findViaBy()
- $row->findViaByAnd()

例子:

<?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)!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門(mén)話題