ZF框架數據對象映射模式的思考

  最近學了ZF框架,對手冊中DB這一節Zend_Db_Table_Row的介紹中說,使用了Zend_Db_Table::find()或::findRow()方法能夠返回一個Zend_Db_Table_Row的對象,該對象自動映射到表中的這一行記錄,字段和類屬性徹底關聯在一塊兒(字段名是下劃線分隔的,屬性名由首個單詞小寫的駝峯式命名,如自動「last_name」,則操做時屬性名「lastName」),獲取任何字段就直接像操做類屬性同樣,如:php

$row = $table->fetchRow('first_name = "Robin"');//$table是Zend_Db_Table實例
echo $row->lastName;//假設輸出‘Bill’

  而修改的操做超級方便,直接對屬性賦值後調用save()方法便可,如:app

$row->lastName = 'Gates';
$row->save();

  數據就會自動更新到表中。以後深究了下源碼,大體仍是邏輯有點多,因此本身理一理,這裏貼出一個簡單的集成該思路的類,按照數據對象映射的模式來思考的,能夠有助於理解。框架

<?php

/**
 * 數據對象映射模式
 *
class DataMapping
{
    protected $id;
    protected $data;
    protected $db;
    protected $change = false;

    function __construct($id)
    {
        $this->db = Factory::getDatabase();
        $res = $this->db->query("select * from user where id = $id limit 1");
        $this->data = $res->fetch_assoc();
        $this->id = $id;
    }

    function __get($key)  //實現對象操做屬性的方式來操做表字段值
    {
        if (isset($this->data[$key]))
        {
            return $this->data[$key];
        }
    }

    function __set($key, $value)  //對於新的字段能夠直接更新進數據表
    {
        $this->data[$key] = $value;
        $this->change = true; 
    }

    function __destruct()  //析構器的功能實現save()邏輯
    {
        if ($this->change)
        {
            foreach ($this->data as $k => $v)
            {
                $fields[] = "$k = '{$v}'";
            }
            $this->db->query("update user set " . implode(', ', $fields) . " where
            id = {$this->id} limit 1");
        }
    }
}
相關文章
相關標籤/搜索