select($fields, $where, '', 1);
return ! empty($list) ? $list[0] : null;
}
/**
* 通过字段条件获取排序后的限制记录
*
* @param array $where
* 查询条件
* @param array $fields
* 要获取的字段信息
* @param int $limit
* 限制记录数
* @param int $offset
* 查询偏移量
* @param array $orderBy
* 排序 array("field1"=>1,"field2"=>0); 0升序1降序
* @return array
*/
public function getList($where = array(), $fields = array(), $limit = null, $offset = null, $orderBy = array())
{
return $this->select($fields, $where, '', $limit, $offset, $orderBy);
}
/**
* 复杂语句的计数查询
*
* @param array $where
* @return int
*/
public function countByMuti($where = array())
{
$arr = $this->buildWhere($where);
return $this->count($arr['where'], $arr['whereString']);
}
/**
* 复杂的查询语句
*
* @param array $where
* 1.'key'=>$value 等于的查询条件
* 2.'key'=>array( '_logic'=>'比较运算符或like' , 'value'=>$value ) '<','<=','>','>=','!=','LIKE'的查询条件
* 3.'key'=>array($value1,$value2,$value3,...) IN范围查询
* 4.'key'=>array( array( '_logic'=>'比较运算符或like' , 'value'=>$value ) ,'key'=>$value ) 一个字段多个查询条件
* @param array $fields
* @param int $limit
* @param int $offset
* @param array $orderBy
* @return array
*/
public function getListByMuti($where = array(), $fields = array(), $limit = null, $offset = null, $orderBy = array())
{
$arr = $this->buildWhere($where);
return $this->select($fields, $arr['where'], $arr['whereString'], $limit, $offset, $orderBy);
}
/**
* 复杂的查询语句
*
* @param array $where
* 1.'key'=>$value 等于的查询条件
* 2.'key'=>array( '_logic'=>'比较运算符或like' , 'value'=>$value ) '<','<=','>','>=','!=','LIKE'的查询条件
* 3.'key'=>array($value1,$value2,$value3,...) IN范围查询
* 4.'key'=>array( array( '_logic'=>'比较运算符或like' , 'value'=>$value ) ,'key'=>$value ) 一个字段多个查询条件
* @param array $fields
* @param int $limit
* @param int $offset
* @param array $orderBy
* @return array
*/
public function getAllByMutiple($where = array(), $fields = array(), $orderBy = array(),$limit=null,$offset=null)
{
$arr = $this->buildWhere($where);
return $this->select($fields, $arr['where'], $arr['whereString'], $limit, $offset, $orderBy);
}
/**
* 更新(基于ID)
* @param int $id
* @param array $data
* @return int
*/
public function update($id, $data)
{
return parent::update($data, array('id'=>$id));
}
/**
* 复杂的更新语句
*
* @param array $set
* 1.'key'=>$value 等于参数设置
* 2.'key'=>array( '_logic'=>'运算符','value'=>$value ) 含 '+', '-','*','/','%'运算符号的参数设置
* @param array $where
* @return bool|int
*/
public function updateByMuti($set = array(), $where = array())
{
$wArr = $this->buildWhere($where);
$sArr = $this->buildSet($set);
$sql = " UPDATE `" . $this->tableName . "` SET " . $sArr['setString'] . ' WHERE ' . $wArr['whereString'];
$prepared = array_merge($wArr['where'], $sArr['set']);
return $this->write($sql, $prepared);
}
/**
* 将复杂的查询条件转换为PDO类可解读的参数绑定方式
*
* @param array $map
* 条件
* $map允许的键值格式(所有的条件是AND组合的):
* 1.'key'=>$value 等于的查询条件
* 2.'key'=>array( '_logic'=>'比较运算符或like' , 'value'=>$value ) '<','<=','>','>=','!=','LIKE'的查询条件
* 3.'key'=>array($value1,$value2,$value3,...) IN范围查询
* 4.'key'=>array( array( '_logic'=>'比较运算符或like' , 'value'=>$value ) ,'key'=>$value ) 一个字段多个查询条件
* @return array
*/
public function buildWhere($map)
{
$fhArr = array(
'<',
'<=',
'>',
'>=',
'!=',
'LIKE'
);
$where = array();
$whereString = array();
foreach ($map as $k => $v) {
if (is_array($v)) {
if (! empty($v['_logic'])) {
$v['_logic'] = strtoupper($v['_logic']);
if (in_array($v['_logic'], $fhArr)) {
$whereString[] = self::escapeKey($k) . ' ' . $v['_logic'] . ' ' . self::replaceKey($k, 'wh_') . '';
$where[self::replaceKey($k, 'wh_')] = $v['value'];
}
} else {
$mixArr = array();
foreach ($v as $ke => $va) {
if (is_array($va)) {
if (! empty($va['_logic'])) {
$va['_logic'] = strtoupper($va['_logic']);
if (in_array($va['_logic'], $fhArr)) {
$whereString[] = self::escapeKey($k) . ' ' . $va['_logic'] . ' ' . self::replaceKey($k . $ke, 'wh_') . '';
$where[self::replaceKey($k . $ke, 'wh_')] = $va['value'];
}
}
} else {
$mixArr[] = $va;
}
}
if (! empty($mixArr)) {
$string = self::escapeKey($k) . ' IN ( ';
$first = '';
foreach ($mixArr as $ke => $va) {
$string .= $first . self::replaceKey($k . $ke, 'wh_');
$where[self::replaceKey($k . $ke, 'wh_')] = $va;
$first = ',';
}
$string .= ' ) ';
$whereString[] = $string;
}
}
} else {
$whereString[] = self::escapeKey($k) . ' = ' . self::replaceKey($k, 'wh_');
$where[self::replaceKey($k, 'wh_')] = $v;
}
}
return array(
'where' => $where,
'whereString' => implode(' AND ', $whereString)
);
}
/**
* 将复杂的更新条件转换为PDO类可解读的参数绑定方式
*
* @param array $map
* 参数设置
* $map设置参数的格式:
* 1.'key'=>$value 等于参数设置
* 2.'key'=>array( '_logic'=>'运算符','value'=>$value ) 含 '+', '-','*','/','%'运算符号的参数设置
* @return array()
*/
public function buildSet($map)
{
if (! is_array($map) || empty($map)) {
return '';
}
$setString = array();
$set = array();
foreach ($map as $k => $v) {
if (is_array($v)) {
if (! empty($v['_logic'])) {
if (in_array($v['_logic'], array(
'+',
'-',
'*',
'/',
'%'
))) {
$setString[] = self::escapeKey($k) . ' = ' . self::escapeKey($k) . ' ' . $v['_logic'] . ' ' . self::replaceKey($k, 'st_');
$set[self::replaceKey($k, 'st_')] = $v['value'];
}
}
} else {
$setString[] = self::escapeKey($k) . '=' . self::replaceKey($k, 'st_');
$set[self::replaceKey($k, 'st_')] = $v;
}
}
return array(
'set' => $set,
'setString' => implode(' , ', $setString)
);
}
/**
* 安全过滤key
*
* @param string $key
* @return string
*/
protected function escapeKey($key)
{
$key = str_replace(array(
'`',
' '
), '', $key);
return ' `' . addslashes(stripslashes($key)) . '` ';
}
/**
* 参数绑定value
*
* @param string $key
* @return string
*/
protected function replaceKey($key, $prefix = '')
{
return ':' . $prefix . $key;
}
}