同步數據庫

遊戲,有的中文,英文兩個語言版本,所以,遊戲有2個靜態資源配置庫,分別是中文配置庫和英文配置庫。

有這樣的一個需求,如果數值策劃修改中文靜態資源配置庫,例如,他修改了某一條數據,那麼,此時應該把修改的內容同步多英文靜態資源配置庫中。


同步的時候,需要注意這樣的問題:

如果修改中文數據庫裏面的某一條記錄,同步到英文靜態庫的時候,使用update函數,需要注意的時候,類似於name, description這樣的字段原則上不能修改。


如果是插入一條新的數據,這個時候的做法是,找到兩個數據庫裏面的同一張需要同步的表,把插入的數據查找出來,生成插入SQL,如果這條SQL需要翻譯,則讓翻譯翻譯這條SQL,然後在英文靜態資源庫對應的表中執行這條SQL。


同步的基本思路:

同步兩個庫裏面指定的表。

獲取中文庫裏面的指定表所有數據。

遍歷所有數據,如果這條數據在英文資源庫裏面,則更新,同時,排除掉某些字段。

否則,把這條數據形成一個SQL.


代碼如下:

<?php

// 命令模式的測試
class Controller_Syncsql extends Core_Controller_Cli
{
    /*
     同步兩個庫裏面的指定的表
     可以排除某些字段
     如果源數據數據庫中的記錄不在目的數據庫中,則生成插入語句,並返回給翻譯。
     翻譯完成後,再由程序執行一遍
    */
    public function indexAction($tabName='ship', $exces=array('name', 'description'))
    {
        // 創建英文數據庫的連接
        $table = 'Dao_Static_' . $tabName;

        $enDao = new $table();
        $enDao->setDbName('voyage_static_en_us');

        // 創建中文數據庫的連接
        $cnDao = new $table();
        $cnDao->setDbName('voyage_static_zh_cn');

        // 讀取源數據庫中指定的表所有的數據
        $cnData = $cnDao->fetchAll();

        // 可執行的SQL
        $execSql = array();

        foreach ($cnData as $key => &$value) {
            // 查詢這條記錄是否在目的數據庫的表中
            if ($enDao->where(array('id' => $value['id']))->fetchRow()) {

                // 排除不需要更新的字段
                foreach ($exces as $exce)
                {
                    if (isset($value[$exce])) {
                        unset($value[$exce]);
                        continue;
                    }
                }

                $enDao->where(array('id' => $value['id']))->update($value);
            } else {
                // 否則把這條數據拼接爲一條可執行的sql
                $keys = array_keys($value);
                // 刪除數組裏面id元素
                unset($keys[0]);

                $sql = 'insert into `' . $tabName . '`(';

                $sql .= implode(',', $keys) . ')';

                $sql .= 'VALUES (';

                foreach ($keys as $key) {
                    $sql .= "'". $value[$key] . "',";
                }

                // 去掉最後一個','
                $sql = substr($sql, 0, strlen($sql) - 1);

                $sql .= ')';

                $execSql[] = $sql;
            }
        }

        return $execSql;
    }
}



發佈了41 篇原創文章 · 獲贊 14 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章