以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);