在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());
Categories: ZendFramework