在ZendFramework中,可以將每張資料表的控制寫成Model,這樣的好處是可以讓Controller更為乾淨,也可以避免直接撰寫sql語法
如果透過zf tools建立整個流程會方便許多,以下範例皆是利用zf tools建立
0.資料庫schema及預設資料
CREATE TABLE IF NOT EXISTS `admin` ( `id` int(11) NOT NULL AUTO_INCREMENT, `account` varchar(50) NOT NULL, `password` varchar(50) NOT NULL, `status` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; INSERT INTO `admin` (`id`, `account`, `password`, `status`) VALUES (1, 'johnson', 'root123', 1);
1.資料庫設定
利用zf tools建立
#可以將production換成其他群組,例如:development、testing zf configure db-adapter 'adapter=PDO_MYSQL&dbname="test"&host="localhost"&username="root"&password="123"' production
完成後應該可以看到application/configs/application.ini
resources.db.adapter = "PDO_MYSQL" resources.db.params.dbname = "test" resources.db.params.host = "localhost" resources.db.params.username = "root" resources.db.params.password = "123" ;這行必須手動加進去,將語系設成utf8 resources.db.params.driver_options.1002 = "SET NAMES utf8"
2.建立Table物件
利用zf tools建立
#Admin為Table物件名稱,admin為資料表名稱 zf create db-table Admin admin
如果成功在application/models/DbTable會建立出一個Admin.php,並會有以下內容
class Application_Model_DbTable_Admin extends Zend_Db_Table_Abstract
{
protected $_name = 'admin';
}
3.建立Table Row Model
利用zf tools建立
zf create model AdminRow
成功的話路徑會是application/models/AdminRow.php,Row Model主要定義Row的資料和控制方法
class Application_Model_AdminRow
{
protected $_id;
protected $_account;
protected $_password;
protected $_status;
public function __construct($options = null)
{
if (is_array($options)) {
$this->setOptions($options);
}
}
public function __set($name, $value)
{
$method = 'set' . ucfirst($name);
if (!method_exists($this, $method)) {
throw new Exception('Invalid property');
}
$this->$method($value);
}
public function __get($name)
{
$method = 'get' . ucfirst($name);
if (!method_exists($this, $method)) {
throw new Exception('Invalid property');
}
return $this->$method();
}
public function setOptions($options)
{
$methods = get_class_methods($this);
foreach ($options as $key => $value) {
$method = 'set' . ucfirst($key);
if (in_array($method, $methods)) {
$this->$method($value);
}
}
return $this;
}
public function setId($id)
{
$this->_id = $id;
return $this;
}
public function setAccount($account)
{
$this->_account = $account;
return $this;
}
public function setPassword($password)
{
$this->_password = $password;
return $this;
}
public function setStatus($status)
{
$this->_status = $status;
return $this;
}
public function getId()
{
return $this->_id;
}
public function getAccount()
{
return $this->_account;
}
public function getPassword()
{
return $this->_password;
}
public function getStatus()
{
return $this->_status;
}
}
4.建立Table Mapper
利用zf tools建立
zf create model AdminMapper
成功的話路徑會是application/models/AdminMapper.php
在開發時主要使用此物件操作資料表,因此這個物件的方法就是隨著操作資料庫的需求自行撰寫
class Application_Model_AdminMapper
{
protected $_dbTable;
//設定資料表物件
public function setDbTable($dbTable)
{
if (is_string($dbTable)) {
$dbTable = new $dbTable();
}
if (!$dbTable instanceof Zend_Db_Table_Abstract) {
throw new Exception('Invalid table data gateway provided');
}
$this->_dbTable = $dbTable;
return $this;
}
//取得資料表物件
public function getDbTable()
{
if (null === $this->_dbTable) {
$this->setDbTable('Application_Model_DbTable_Admin');
}
return $this->_dbTable;
}
//Insert and Update
public function save($admin)
{
$data = array(
'id' => $admin->getId(),
'account' => $admin->getAccount(),
'password' => $admin->getPassword(),
'status' => $admin->getStatus(),
);
foreach ($data as $key => $val) {
if (null === $val) {
unset($data[$key]);
}
}
if (null === ($id = $admin->getId())) {
$this->getDbTable()->insert($data);
} else {
$this->getDbTable()->update($data, array('id = ?' => $id));
}
}
//find ID(Primary Key)
public function find($id)
{
$result = $this->getDbTable()->find($id);
if (0 == count($result)) {
return;
}
$row = $result->current();
$admin = new Application_Model_AdminRow();
$admin->setId($row->id)
->setAccount($row->account)
->setPassword($row->password)
->setStatus($row->status);
return $admin;
}
//Search Account
public function searchAccount($account)
{
if (null === $account) {
return ;
}
$select = $this->getDbTable()->select()->where("account = ?",$account);
return $this->fetchAll($select);
}
public function fetchAll($select = null)
{
//如果只抓單筆可以使用fetchRow($select)
$resultSet = $this->getDbTable()->fetchAll($select);
$entries = array();
foreach ($resultSet as $row) {
$entry = new Application_Model_AdminRow();
$entry->setId($row->id)
->setAccount($row->account)
->setPassword($row->password)
->setStatus($row->status);
$entries[] = $entry;
}
return $entries;
}
}
5.測試
在Controller中就可以測試是否成功連結
$table_admin = new Application_Model_AdminMapper();
//Insert
$options = array(
'account' => '這只是測試',
'password' => '123',
'status' => '2'
);
$table_admin->save(new Application_Model_AdminRow($options));
//Update
$options = array(
'id' => '2',
'password' => '456',
);
$table_admin->save(new Application_Model_AdminRow($options));
//SearchName
print_r($table_admin->searchAccount('Hello'));
//find
print_r($table_admin->find(1));
//All
print_r($result = $table_admin->fetchAll());