/** * Returns the static model of the specified AR class. * @return CActiveRecord the static model class */ public static function model($className = __CLASS__) { return parent::model($className); }
/** * 根据表名获取记录 * @param $tname string 表名(可以是由item虚化出来的,如“item_nnhysj_tz”) * @return 记录总数 */ public function getFind($tname) { $ts = $this->parseRealTable($tname); if ($this->beforeFind()) { $this->applyScopes($ts['criteria']); $rows = DBModel::model()->getDb()->selectCollection($ts['name'])->find($ts['criteria']->getConditions()); } return $rows; }
/** * 同步json数据到相应数实体表 * 用来使用js更新表数据,操作需谨慎 * 普通索引: index{"RealCost":1},[] * 唯一索引: index{"ItemShopTags":1},{"unique":true} * 新数据: {"_id":"item_blink","ItemShopTags":["传送"],"Lines":[],"RealCost":2150,"Category":"奥术"} * 更新数据: {"_id":"item_blink"},{"$set":{"ItemShopTags":["传送","防具"]}} */ public function actionSynJStoDB() { $js_id = isset($_GET['id']) ? $_GET['id'] : ''; //待同步文件名路径 $file = File::model()->findByPk(new MongoId($js_id)); if (!$file) { throw new CHttpException(404, '该数据文件不存在。'); } $js_name = pathinfo($file->metadata['name']); //真实文件名 $js_name = $js_name['filename']; $exers = array('i' => array(0, 0), 'a' => array(0, 0), 'u' => array(0, 0)); if ($file) { $id_info = explode('-', $js_name); //剔除文件名中的日期 // foreach($id_info as $namekey=>$namevo){ // if(preg_match('/^\d{14}$/i', $namevo)){ // unset($id_info[$namekey]); // $cname = implode('-', $id_info); // } // } //确认集合名称 if ($id_info > 1) { $tables = $this->_listCollections(DBModel::model()->getDb()); foreach ($id_info as $namevo) { //集合名称:当前库中存在该集合或者以‘item_’开头 if (isset($tables[$namevo])) { $cname = $namevo; break; } } } //获取并执行导入新数据 $body = $file->getBytes(); //获取文件内容 $lines = preg_split('/(\\r\\n|\\n)/i', $body); //每行作为一个语句 //若仅为集合名称,则清空该集合内容,修改为独立操作 //if(count($id_info)==1){ // CardItem::model()->getDb()->selectCollection($cname)->remove(); //drop会删除集合,remove仅清空记录 //} //循环进行插入/更新/创建索引 foreach ($lines as $line) { $line = trim($line); if (!empty($line)) { //判定是否为索引,若是则创建,否则作为普通数据直接插入 if (substr($line, 0, 5) == 'index') { //索引记录以index字符串开头 //$exe_query = 'ensureIndex(o)'; $line = substr($line, 5); //$exe_query = 'ensureIndex(o)'; $ret = DBModel::model()->getDb()->selectCollection('system.indexes')->insert((array) json_decode($line)); $exers['i'][$ret]++; //记录执行结果 //判断是否是更新 } else { if (preg_match('/^\\{"_id":"[0-9a-z_-]+"\\},/i', $line)) { $line = explode('},{"$set":', $line); if (isset($line[1])) { $update_where = (array) json_decode($line[0] . '}'); if (preg_match('/^[a-z0-9]{24}$/', $update_where['_id'])) { $update_where['_id'] = new MongoId($update_where['_id']); } $ret = DBModel::model()->getDb()->selectCollection($cname)->update($update_where, (array) json_decode('{"$set":' . $line[1])); $exers['u'][$ret]++; } //其余为插入 } else { //$exe_query = 'insert(o)'; $line = (array) json_decode(preg_replace('/\\{.?"\\$oid".?:.?("[0-9a-z]+")[^}]?\\}/i', '\\1', $line)); //转为普通字符串 //重新构造MongoId的_id if (preg_match('/^[a-z0-9]{24}$/', $line['_id'])) { $line['_id'] = new MongoId($line['_id']); } $ts = DBModel::model()->parseRealTable($cname); $ret = DBModel::model()->getDb()->selectCollection($ts['name'])->insert($line); $exers['a'][$ret]++; } } } } } $this->redirect_back(array('exers' => $exers['i'][0] . '#' . $exers['i'][1] . '#' . $exers['a'][0] . '#' . $exers['a'][1] . '#' . $exers['u'][0] . '#' . $exers['u'][1])); //返回上一页 /* 参考代码 db.getCollection("game").ensureIndex({ "code": NumberInt(1) },[]); db.getCollection("game").insert({ "_id": ObjectId("516140719b2a952c14000000"), "name": "Dota2", }); */ }
width: 100%; } --> </style> <form method="post" action="/dump/export"> <ul class="list"> <?php if (empty($tables)) { ?> 数据库为空 <?php } else { ?> <?php foreach ($tables as $en_name => $name) { $rows = DBModel::model()->getCount($en_name); ?> <li> <label> <input type="checkbox" class="all_input" name="checked[]" value="<?php echo $en_name; ?> " <?php if (in_array($name, $selectedTables)) { ?> checked="checked"<?php } ?> /> <b><?php echo $name;