以YII、自定義數據操作兩種方式組成的數據庫微服務的客戶端。
類介紹
Base類
Dg_Db_Base,繼承自Dg_Db_Yii類
class Dg_Db_Base extends Dg_Db_Yii {
}
Yii類
Dg_Db_Yii,繼承自Dg_Db_Hnb類,以YII框架的方式調用數據庫。
實現思路:
1,通過魔術函數(__call、__callStatic、__set),獲取函數調用鏈中的信息並存儲。
2,將獲取的調用鏈中的信息請求至服務端。
3,服務端通過函數(call_user_func_array、forward_static_call_array),調用YII提供的相關函數。
/**
* 數據庫操作基類,基於Yii框架。繼承後即可使用Yii框架中的操作數據庫的方式。
* 操作數據庫可以分爲如下三類(可以參考Yii2中的使用說明)
* 一、Command操作,以commandDone函數結尾。
* Model::getInstance()->createCommand({查詢語句})->queryAll()->commandDone();
* Model::getInstance()->createCommand({修改語句})->execute()->commandDone();
* Model::getInstance()->createCommand()->insert('{表名}', ['{字段}'=>'{值}'], '{條件}')->execute()->commandDone();
* Model::getInstance()->createCommand()->update('{表名}', ['{字段}'=>'{值}'], '{條件}')->execute()->commandDone();
* Model::getInstance()->createCommand()->delete('{表名}','{條件}')->execute()->commandDone();
* 二、ActiveRecord操作,以recordDone函數結尾。
* 查詢
* Model::find()->select('f_id,name')->where([f_id'=>'5'])->limit(10)->all()->recordDone();
* Model::findOne(3)->recordDone();
* Model::findAll([1,3,5])->recordDone();
* Model::findAll(['f_id'=>3])->recordDone();
* 插入
* $obj = Model::getInstance();
* $obj->name = '西米';
* $obj->save()->recordDone();
* 更新
* $obj = Model::findOne(7);
* $obj->name = '西米123';
* $obj->save()->recordDone();
* 刪除
* $obj = Model::findOne(7);
* $obj->delete()->recordDone();
* 遞增
* Model::updateAllCounters(['f_create_time' => 10])->recordDone();
* 三、Query操作,以queryDone函數結尾
* Model::getInstance()->select('f_id,f_name,f_email')->from('t_transact_user_info')->where(['f_id'=>'1513'])->limit(10)->all()->queryDone();
*/
class Dg_Db_Yii extends Dg_Db_Hnb {
private $_callArr = array();
public function __call($fun, $arguments)
{
$this->_callArr[$fun] = !empty($arguments) ? $arguments : '';
return $this;
}
private static $_callStaticArr = array();
public function __callStatic($fun, $arguments)
{
$class = get_called_class();
$self = new $class();
self::$_callStaticArr[$fun] = !empty($arguments) ? $arguments : '';
return $self;
}
private $_callSetArr = array();
public function __set($name, $value)
{
$this->_callSetArr[$name] = $value;
}
/**
* 執行
*/
private function done($type = 'index')
{
$this->init();
// 請求
$requestParam = array(
'_call' => $this->_callArr,
'_callStatic' => self::$_callStaticArr,
'_callSet' => $this->_callSetArr,
);
$url = $this->getRequestUrl('query', $type);
$result = $this->getRequestText($url, $requestParam);
$result = json_decode($result, true);
if ( !$result['state'] && !empty($result['data']) ) {
unset($this->_callArr);
self::$_callStaticArr = array();
// 數據解密處理
if ( count($result['data']) == count($result['data'],1) ) {
$result['data'] = current($this->_decryptyData(array($result['data'])));
} else {
$result['data'] = $this->_decryptyData($result['data']);
}
}
return $this->formatResult($result);
}
/**
* 返回數據格式化
*/
public function format($default = '')
{
$this->_formatResult = true;
$this->_formatDefault= $default;
return $this;
}
/**
* Yii\db\Query命令請求
*/
public function queryDone()
{
return $this->done('index');
}
/**
* Yii\db\ActiveRecord命令請求
*/
public function recordDone()
{
return $this->done('record');
}
/**
* Yii\db\Command命令請求
*/
public function commandDone()
{
return $this->done('command');
}
}
Hnb類
Dg_Db_Hnb,自定義的數據庫調用方式。
實現思路:
1,自定義操作數據庫相關的函數,如query、queryWithTotal、detail、countNum、insert、update等函數。
2,將相關參數請求至服務端並調用對應的函數(服務端需要定義相關的函數操作數據庫)。
/**
* 數據庫操作基類,繼承後即可使用數據庫操作相關的函數
* 查詢函數,query、queryWithTotal、one、detail、countNum
* 操作函數,insert、insertMulit、replace、replaceMulti、update、delete、incr
* 事務函數,startTransct、commitTransact、rollbackTransact
* 配置函數,setDbType、setDbName、setTable、setField
*/
class Dg_Db_Hnb extends Dg_Singleton {
/**
* 查詢數據
* @param array $param 查詢條件,條件數組或者條件SQL
* @param string $order 排序規則
* @param string $limit 獲取條數
* @param string $field 查詢的列,默認爲*
* @param string $group 分組規則
* @return array 數據列表
*/
public function query($param = array(), $order = false, $limit = false, $field = '*', $group = false)
{
$param = $this->_encryptyParam($param);
$requestParam = array(
'param' => serialize($param),
'order' => strval($order),
'limit' => strval($limit),
'field' => strval($field),
'group' => strval($group),
);
$url = $this->getRequestUrl('dql', __FUNCTION__);
$result = $this->getRequestText($url, $requestParam);
$result = json_decode($result, true);
if ( !$result['state'] && !empty($result['data']) ) {
$result['data'] = $this->_decryptyData($result['data']);
}
return $this->formatResult($result, array());
}
/**
* 查詢一條數據
* @param array $param 查詢條件,條件數組或者條件SQL
* @param string $field 查詢的列,默認爲*
* @return array 數據
*/
public function detail($param, $field = '*')
{
$param = $this->_encryptyParam($param);
$requestParam = array(
'param' => serialize($param),
'field' => strval($field),
);
$url = $this->getRequestUrl('dql', __FUNCTION__);
$result = $this->getRequestText($url, $requestParam);
$result = json_decode($result, true);
if ( !$result['state'] && !empty($result['data']) ) {
$result['data'] = current($this->_decryptyData(array($result['data'])));
}
return $this->formatResult($result, array());
}
/**
* 刪除數據
* @param array $param 查詢參數,同query
* @return array(
* 'state' => 0(0成功,其他錯誤碼),
* 'errorCode' => '',
* 'data' => ''(錯誤信息或者受影響的行數)
* )
*/
public function delete($param)
{
$param= $this->_encryptyParam($param);
$requestParam = array(
'param' => serialize($param),
);
$this->getRequestParam($requestParam);
$url = $this->getRequestUrl('dml', __FUNCTION__, 'post');
$result = $this->getPostText($url, $requestParam);
return json_decode($result, true);
}
}
使用說明
繼承自Dg_Db_Base類型
以YII方式調用
Model::find()->select("*")->where($whereParam)->orderBy($order)->offset($offset)->limit($num)->all()->recordDone();
自定義方式調用
Model::getInstance()->query($where , $order , $limit);