同步数据库

游戏,有的中文,英文两个语言版本,所以,游戏有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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章