You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
411 lines
11 KiB
411 lines
11 KiB
<?php
|
|
|
|
/**
|
|
* 公共模型类
|
|
*/
|
|
|
|
namespace base;
|
|
|
|
class Model {
|
|
|
|
/**
|
|
* 模型配置
|
|
* @var array
|
|
*/
|
|
protected $config =array();
|
|
|
|
/**
|
|
* 操作参数
|
|
* @var array
|
|
*/
|
|
protected $options = array(
|
|
'table' => '',
|
|
'field' => '*',
|
|
'where' => array(),
|
|
'order' => '',
|
|
'limit' => '',
|
|
'data' => array(),
|
|
'pager' => array(),
|
|
);
|
|
|
|
/**
|
|
* 数据库配置名
|
|
* @var string
|
|
*/
|
|
protected $database = 'default';
|
|
|
|
/**
|
|
* 操作表
|
|
* @var string
|
|
*/
|
|
protected $table = '';
|
|
|
|
/**
|
|
* 当前表
|
|
* @var null
|
|
*/
|
|
protected $trueTable = null;
|
|
|
|
/**
|
|
* 驱动对象
|
|
* @var array
|
|
*/
|
|
protected static $objArr = array();
|
|
|
|
/**
|
|
* 分页信息
|
|
* @var null
|
|
*/
|
|
public $pager = null;
|
|
|
|
/**
|
|
* 初始化
|
|
* @param string $database 模型配置名
|
|
*/
|
|
public function __construct( $database = 'default' ) {
|
|
if( $database ){
|
|
$this->database = $database;
|
|
}
|
|
$this->config = Config::get('DB.' . $this->database);
|
|
if( empty($this->config) || !isset($this->config['DB_TYPE']) ) {
|
|
throw new \Exception($this->database.' database config error', 500);
|
|
}
|
|
$this->table = (null==$this->trueTable) ? $this->config['DB_PREFIX'].$this->table : $this->trueTable;
|
|
$this->trueTable = $this->table;
|
|
$this->table($this->trueTable, true);
|
|
}
|
|
|
|
/**
|
|
* 执行SQL查询
|
|
* @param string $sql SQL语句
|
|
* @param array $params 过滤参数
|
|
* @return mixed
|
|
*/
|
|
public function query($sql, $params = array()) {
|
|
$sql = trim($sql);
|
|
if ( empty($sql) ) return array();
|
|
$sql = str_replace('{pre}', $this->config['DB_PREFIX'], $sql);
|
|
//判断当前的sql是否是查询语句
|
|
if (stripos(trim($sql), 'show') === 0 || stripos(trim($sql), 'select') === 0 || stripos(trim($sql), 'desc') === 0) {
|
|
return $this->getDb()->query($sql, $params);
|
|
} else {
|
|
return $this->execute($sql, $params); //不是查询条件,直接执行
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 执行SQL读写
|
|
* @param string $sql SQL语句
|
|
* @param array $params 过滤参数
|
|
* @return mixed
|
|
*/
|
|
public function execute($sql, $params = array()) {
|
|
$sql = trim($sql);
|
|
if ( empty($sql) ) return 0;
|
|
$sql = str_replace('{pre}', $this->config['DB_PREFIX'], $sql);
|
|
return $this->getDb()->execute($sql, $params);
|
|
}
|
|
|
|
/**
|
|
* 查询一条数据
|
|
* @return array
|
|
*/
|
|
public function find() {
|
|
$this->limit(1);
|
|
$data = $this->select();
|
|
return isset($data[0]) ? $data[0] : array();
|
|
}
|
|
|
|
/**
|
|
* 查询多条数据
|
|
* @return array
|
|
*/
|
|
public function select() {
|
|
$field = $this->options['field'];
|
|
if( empty($field) ) $field = '*';
|
|
$this->options['field'] = '*';
|
|
|
|
$order = $this->options['order'];
|
|
$this->options['order'] = '';
|
|
|
|
$limit = $this->options['limit'];
|
|
$this->options['limit'] = '';
|
|
|
|
$table = $this->_getTable();
|
|
$where = $this->_getWhere();
|
|
|
|
//Pagination
|
|
if( !empty($this->options['pager']) ){
|
|
$count = $this->getDb()->Count($table, $where);
|
|
$this->_pager($this->options['pager']['page'], $this->options['pager']['pageSize'],
|
|
$this->options['pager']['scope'], $count);
|
|
$this->options['pager'] = array();
|
|
$limit = $this->pager['offset'] . ',' . $this->pager['limit'];
|
|
}
|
|
|
|
return $this->getDb()->select($table, $where, $field, $order, $limit);
|
|
}
|
|
|
|
/**
|
|
* 插入数据
|
|
* @return integer
|
|
*/
|
|
public function insert() {
|
|
if( empty($this->options['data']) || !is_array($this->options['data']) ) return false;
|
|
|
|
return $this->getDb()->insert($this->_getTable(), $this->_getData());
|
|
}
|
|
|
|
/**
|
|
* 更新数据
|
|
* @return boolean
|
|
*/
|
|
public function update() {
|
|
if( empty($this->options['where']) || !is_array($this->options['where']) ) return false;
|
|
if( empty($this->options['data']) || !is_array($this->options['data']) ) return false;
|
|
|
|
return $this->getDb()->update($this->_getTable(), $this->_getWhere(), $this->_getData());
|
|
}
|
|
|
|
/**
|
|
* 删除数据
|
|
* @return boolean
|
|
*/
|
|
public function delete() {
|
|
if( empty($this->options['where']) || !is_array($this->options['where']) ) return false;
|
|
|
|
return $this->getDb()->delete($this->_getTable(), $this->_getWhere());
|
|
}
|
|
|
|
/**
|
|
* 统计数据
|
|
* @return integer
|
|
*/
|
|
public function count() {
|
|
return $this->getDb()->count($this->_getTable(), $this->_getWhere());
|
|
}
|
|
|
|
/**
|
|
* 获取表字段
|
|
* @return array
|
|
*/
|
|
public function getFields() {
|
|
return $this->getDb()->getFields( $this->_getTable() );
|
|
}
|
|
|
|
/**
|
|
* 获取最后查询语句
|
|
* @return string
|
|
*/
|
|
public function getSql() {
|
|
return $this->getDb()->getSql();
|
|
}
|
|
|
|
/**
|
|
* 启动事务
|
|
* @return boolean
|
|
*/
|
|
public function beginTransaction() {
|
|
return $this->getDb()->beginTransaction();
|
|
}
|
|
|
|
/**
|
|
* 提交事务
|
|
* @return boolean
|
|
*/
|
|
public function commit() {
|
|
return $this->getDb()->commit();
|
|
}
|
|
|
|
/**
|
|
* 回滚事务
|
|
* @return boolean
|
|
*/
|
|
public function rollBack() {
|
|
return $this->getDb()->rollBack();
|
|
}
|
|
|
|
/**
|
|
* 设置表
|
|
* @param string $table 表名
|
|
* @param boolean $ignorePre 独立前缀
|
|
* @return object
|
|
*/
|
|
public function table($table, $ignorePre = false) {
|
|
$this->options['table'] = $ignorePre ? $table : $this->config['DB_PREFIX'] . $table;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* 联操作表
|
|
* @param string $join 联接表语句
|
|
* @param string $way 联接类型
|
|
* @return object
|
|
*/
|
|
public function join($join, $way='inner') {
|
|
$join = str_replace('{pre}', $this->config['DB_PREFIX'], $join);
|
|
$this->options['table'] = " {$this->options['table']} {$way} join {$join} ";
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* 查询字段
|
|
* @param string $field 查询表指定字段
|
|
* @return object
|
|
*/
|
|
public function field($field) {
|
|
$this->options['field'] = $field;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* 操作数据
|
|
* @param array $data 插入或者更新数据数组
|
|
* @return object
|
|
*/
|
|
public function data(array $data = array()) {
|
|
$this->options['data'] = $data;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* 查询条件
|
|
* @param array $where 条件数组
|
|
* @return object
|
|
*/
|
|
public function where(array $where = array()) {
|
|
$this->options['where'] = $where;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* 排序规则
|
|
* @param string $order 查询结果排序
|
|
* @return object
|
|
*/
|
|
public function order($order) {
|
|
$this->options['order'] = $order;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* 查询数量
|
|
* @param integer $limit 查询结果数量
|
|
* @return object
|
|
*/
|
|
public function limit($limit) {
|
|
$this->options['limit'] = $limit;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* 查询分页
|
|
* @param integer $page 当前页数
|
|
* @param integer $pageSize 每页数量
|
|
* @param integer $scope 页数范围
|
|
* @return object
|
|
*/
|
|
public function pager($page, $pageSize = 10, $scope = 10) {
|
|
$page = max(intval($page), 1);
|
|
$this->options['pager'] = compact(array('page', 'pageSize', 'scope'));
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* 查询缓存
|
|
* @param integer $expire 缓存时间:秒
|
|
* @return boolean
|
|
*/
|
|
public function cache($expire = 1800) {
|
|
$cache = new Cache($this->config['DB_CACHE']);
|
|
$cache->proxyObj = $this;
|
|
$cache->proxyExpire = $expire;
|
|
return $cache;
|
|
}
|
|
|
|
/**
|
|
* 清空缓存
|
|
* @return boolean
|
|
*/
|
|
public function clear() {
|
|
$cache = new Cache($this->config['DB_CACHE']);
|
|
return $cache->clear();
|
|
}
|
|
|
|
/**
|
|
* 获取驱动对象
|
|
* @return object
|
|
*/
|
|
protected function getDb() {
|
|
if( empty(self::$objArr[$this->database]) ){
|
|
$dbDriver = __NAMESPACE__.'\db\\' . ucfirst( $this->config['DB_TYPE'] ).'Driver';
|
|
self::$objArr[$this->database] = new $dbDriver( $this->config );
|
|
}
|
|
return self::$objArr[$this->database];
|
|
}
|
|
|
|
/**
|
|
* 获取表名
|
|
* @return string
|
|
*/
|
|
protected function _getTable() {
|
|
$table = $this->options['table'];
|
|
$this->options['table'] = $this->table;
|
|
return $table;
|
|
}
|
|
|
|
/**
|
|
* 获取条件
|
|
* @return array
|
|
*/
|
|
protected function _getWhere() {
|
|
$where = $this->options['where'];
|
|
$this->options['where']= array();
|
|
return $where;
|
|
}
|
|
|
|
/**
|
|
* 获取数据
|
|
* @return array
|
|
*/
|
|
protected function _getData() {
|
|
$data = $this->options['data'];
|
|
$this->options['data']= array();
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* 设置分页
|
|
* @return void
|
|
*/
|
|
protected function _pager($page, $pageSize = 10, $scope = 10, $total) {
|
|
$page = max(intval($page), 1);
|
|
$totalPage = ceil( $total / $pageSize );
|
|
|
|
$this->pager = array(
|
|
'page'=> $page,
|
|
'pageSize' => $pageSize,
|
|
'scope' => $scope,
|
|
'totalPage' => $totalPage,
|
|
'totalCount' => $total,
|
|
'firstPage' => 1,
|
|
'prevPage' => ( ( 1 == $page ) ? 1 : ($page - 1) ),
|
|
'nextPage' => ( ( $page == $totalPage ) ? $totalPage : ($page + 1)),
|
|
'lastPage' => $totalPage,
|
|
'allPages' => array(),
|
|
'offset' => ($page - 1) * $pageSize,
|
|
'limit' => $pageSize,
|
|
);
|
|
|
|
if($totalPage <= $scope ){
|
|
$this->pager['allPages'] = range(1, $totalPage);
|
|
}elseif( $page <= $scope/2) {
|
|
$this->pager['allPages'] = range(1, $scope);
|
|
}elseif( $page <= $totalPage - $scope/2 ){
|
|
$right = $page + (int)($scope/2);
|
|
$this->pager['allPages'] = range($right-$scope+1, $right);
|
|
}else{
|
|
$this->pager['allPages'] = range($totalPage-$scope+1, $totalPage);
|
|
}
|
|
}
|
|
}
|
|
|