遊戲,有的中文,英文兩個語言版本,所以,遊戲有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;
}
}