游戏,有的中文,英文两个语言版本,所以,游戏有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;
}
}