首頁 >php教程 >PHP开发 >Zend Framework教學之Zend_Db_Table用法詳解

Zend Framework教學之Zend_Db_Table用法詳解

高洛峰
高洛峰原創
2017-01-05 09:54:391413瀏覽

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

1. 簡介

Zend_Db_Table 是Zend Framework的表模組.它透過zend_db_adapter連接到資料庫,為資料庫模式檢查表物件,並對該表進行操作和查詢.

2. 開始

首先需要為抽象類別zend_db_table(ares註:該類別為抽象類別,所以不能直接實例化,只能先繼承該類別,然後實例化子類別)設定一個預設對資料庫adapter;除非你指定其他類型資料庫adapter,否則,所有的zend_db_table類別實例都會使用預設adapter.

<?php
// 建立一个 adapter
require_once &#39;Zend/Db.php&#39;;
$params = array (
  &#39;host&#39;   => &#39;127.0.0.1&#39;,
  &#39;username&#39; => &#39;malory&#39;,
  &#39;password&#39; => &#39;******&#39;,
  &#39;dbname&#39;  => &#39;camelot&#39;
);
$db = Zend_Db::factory(&#39;PDO_MYSQL&#39;, $params);
// 为所有的Zend_Db_Table对象设定默认的adapter
require_once &#39;Zend/Db/Table.php&#39;;
Zend_Db_Table::setDefaultAdapter($db);
?>

接下來,我們假定資料庫中存在一個名為」round_table」的表.要對該表使用zend_db_table,只需繼承zend_db_table類建立一個名為RoundTable的新類別.然後我就可以透過該類別在資料庫中的round_table表中檢查,操作資料行並且取得資料結果.

<?php
class RoundTable extends Zend_Db_Table {}
$table = new RoundTable();
?>

3. 表名和主鍵

預設情況下,zend_db_table類別會將其類別名稱當作資料庫中表名(大小寫不同的地方需要新增"_").例如,一個名為SomeTableName的zend_db_table類別在資料庫中就對應表」some_table_name”.假如不希望將類別名稱與資料庫表名以這種添加下劃線的形式進行對應,可以在定義該類時對$_name進行重構.

<?php
class ClassName extends Zend_Db_Table
{
  // 默认表名为 &#39;class_name&#39;
  // 但是我们也可以对应其它表
  protected $_name = &#39;another_table_name&#39;;
}
?>

zend_db_table類默認字段”id”為表的主鍵(該字段最好為自增的,但並不是必須的).假如該表的主鍵並不是名為”$id”,你可以在定義表實體類時對$_primary進行重構

<?php
class ClassName extends Zend_Db_Table
{
  // 默认主键为&#39;id&#39;
  // 但我们也可以设定其他列名为主键
  protected $_primary = &#39;another_column_name&#39;;
}
?>

你也可以通過表實體類中_setup()方法設定這些變數;但是需要確保在修改後再執行一次parent::_setup()方法.

<?php
class ClassName extends Zend_Db_Table
{
  protected function _setup()
  {
    $this->_name = &#39;another_table_name&#39;;
    $this->_primary = &#39;another_column_name&#39;;
    parent::_setup();
  }
}
?>

4. 插入資料

要在表中插入一行新資料,只需要將列名:資料的關聯數組作為參數,呼叫insert()方法即可.

(zend framework)會自動對資料進行加引號處理, 並傳回插入的最後一行的id值
(注意:這裡不同於zend_db_adapter::insert方法,後者傳回的是插入的行數).

<?php
//
// INSERT INTO round_table
//   (noble_title, first_name, favorite_color)
//   VALUES ("King", "Arthur", "blue")
//
class RoundTable extends Zend_Db_Table {}
$table = new RoundTable();
$data = array(
  &#39;noble_title&#39; => &#39;King&#39;,
  &#39;first_name&#39; => &#39;Arthur&#39;,
  &#39;favorite_color&#39; => &#39;blue&#39;,
)
$id = $table->insert($data);
?>

5. 更新資料

要修改表中的任意行資料,我們可以設定一個列名:資料的關聯數組作為參數,調用update()方法,同是透過一個where條件子句來決定需要改變的行.該方法將會修改表中資料並傳回被修改的行數.

(Zend frameword)將會自動對修改對資料進行加引號處理,但是這種檢查不包含條件分句,所以你需要使用該表的zend_db_adapter物件完成該工作. 

class RoundTable extends Zend_Db_Table {}
$table = new RoundTable();
$db = $table->getAdapter();
$set = array(
  &#39;favorite_color&#39; => &#39;yellow&#39;,
)
$where = $db->quoteInto(&#39;first_name = ?&#39;, &#39;Robin&#39;);
$rows_affected = $table->update($set, $where);

6. Deleting Rows

要刪除表中的資料,我們可以調用delete()方法,同時透過一個where條件分句來決定需要刪除的行.該方法將會傳回被刪除的行數.

(zend framework)不會對條件分句進行加引號處理,所以你需要使用該表的zend_db_adapter對象完成該工作

<?php
//
// DELETE FROM round_table
//   WHERE first_name = "Patsy"
//
class RoundTable extends Zend_Db_Table {}
$table = new RoundTable();
$db = $table->getAdapter();
$where = $db->quoteInto(&#39;first_name = ?&#39;, &#39;Patsy&#39;);
$rows_affected = $table->delete($where);
?>

7. 根據主鍵查找資料

透過呼叫find()方法,可以使用主鍵值輕鬆地在表中檢索資料.假如你只想要查詢某一條資料,該方法將回傳一個zend_db_table_row物件,當你想要查詢多筆記錄時,將會回傳一個zend_db_table_rowset物件.

<?php
class RoundTable extends Zend_Db_Table {}
$table = new RoundTable();
// SELECT * FROM round_table WHERE id = "1"
$row = $table->find(1);
// SELECT * FROM round_table WHERE id IN("1", "2", 3")
$rowset = $table->find(array(1, 2, 3));
?>

8. 取回一條記錄

雖然透過主鍵找到對應資料行是很便利的事情,但是在更多的時候,我們是透過其他一些非主鍵的條件來查找資料行的.zend_db_table提供了一個fetchRow()方法可以實現這個功能.我們可以透過一個where條件語句(和一個可選的order語句)呼叫fetchRow()方法,然後zend_db_tabel將會回傳滿足條件的第一行資料的zend_db_table_row物件.

注意,(zend framework) 將不會對where語句進行加引號處理,所以你需要透過zend_db_adapter進行資料處理

<?php
//
// SELECT * FROM round_table
//   WHERE noble_title = "Sir"
//   AND first_name = "Robin"
//   ORDER BY favorite_color
//
class RoundTable extends Zend_Db_Table {}
$table = new RoundTable();
$db = $table->getAdapter();
$where = $db->quoteInto(&#39;noble_title = ?&#39;, &#39;Sir&#39;)
    . $db->quoteInto(&#39;AND first_name = ?&#39;, &#39;Robin&#39;);
$order = &#39;favorite_color&#39;;
$row = $table->fetchRow($where, $order);
?>

9. 取回多筆記錄

假如需要一次檢索多筆記錄.可以使用fetchAll()方法.和使用fetchRow()方法類似,該方法不僅僅可以設定where和order分句,也可以設定limit-count和limit-offset值來限制回傳的結果數.執行該方法後,把選擇的結果當作一個Zend_Db_Table_Rowset物件回傳. 
注意,(zend framework) 將不會對where語句進行加引號處理,所以你需要透過zend_db_adapter進行資料處理.

<?php
class RoundTable extends Zend_Db_Table {}
$table = new RoundTable();
$db = $table->getAdapter();
// SELECT * FROM round_table
//   WHERE noble_title = "Sir"
//   ORDER BY first_name
//   LIMIT 10 OFFSET 20
$where = $db->quoteInto(&#39;noble_title = ?&#39;, &#39;Sir&#39;);
$order = &#39;first_name&#39;;
$count = 10;
$offset = 20;
$rowset = $table->fetchAll($where, $order, $count, $offset);
?>

10. Adding Domain Logic

作為Zend Framework的表模組,Zend_Db_Table將它自己很好的封裝到獨特的domain logic下. 例如,你可以重載insert()和update()方法,以實現在數據更改提交前的操作和驗證.

<?php
class RoundTable extends Zend_Db_Table
{
  public function insert($data)
  {
    // 添加一个时间戳
    if (empty($data[&#39;created_on&#39;])) {
      $data[&#39;created_on&#39;] = time();
    }
    return parent::insert($data);
  }
  public function update($data)
  {
    // 添加一个时间戳
    if (empty($data[&#39;updated_on&#39;])) {
      $data[&#39;updated_on&#39;] = time();
    }
    return parent::update($data);
  }
}
?>

類似的,你也可以設定自己的find()方法,透過主鍵外的其他欄位來查詢資料.

<?php
class RoundTable extends Zend_Db_Table
{
  public function findAllWithName($name)
  {
    $db = $this->getAdapter();
    $where = $db->quoteInto("name = ?", $name);
    $order = "first_name";
    return $this->fetchAll($where, $order);
  }
}
?>

希望本文所述對大家基於Zend Framework框架的PHP程式設計有幫助。

更多Zend Framework教程之Zend_Db_Table用法詳解相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn