基于thinkphp的model类封装的增删改查

浏览:7330 发布日期:2017/12/28 分类:技术分享 关键字: sql model
闲的蛋疼 基于thinkphp3.2封装了增删改查;感觉有点多余,但挺好用的

类的方法有点多,所以下面的代码不全。
完整的代码以及使用方法:请下载:https://github.com/iAsuma/asuma_db_demo.git<?php
namespace Home\Model;
use Think\Model;
use Think\Exception;
/**
 * 公共model,封装增删改查
 * 使用本类中方法,数据库得使用Mysql InnoDB引擎才能进行事务操作
 * @author li shuaiqiu(asuma)
 * @version 2.0 time 2017-12-27
 */
class PublicModel extends Model{
    protected $autoCheckFields = false; //虚拟模型关闭自动检测
    
    /**
     * 简单的数据查询,仅能解析成 “=” where的条件
     * @param $table 数据表名
     * @param $param 数组参数,查询条件,非必要参数
     * @param $field 需要查询的参数
     * @return 返回多条数据
     */
    public function think_select_all($table, $param, $field = '*'){
        $where = array();
        $bind = array();
        foreach ($param as $k=>$v){
            $where[$k] = ':'.$k;
            $bind[':'.$k] = $v;
        }
        
        return $this->table($table)->field($field)->where($where)->bind($bind)->select();
    }
    
    /**
     * 原生sql数据查询
     * @param $sql sql语句
     * @param $param 绑定参数,可不传,仅支持传入数组
     * @return 返回一条数据
     */
    public function native_select_one($sql, $param){
        try {
            $parseSql = $this->bindParam($sql, $param);
            $this->isSelectSql($parseSql);
            
            $result = $this->query($parseSql);
            return $result[0];
        } catch (Exception $e) {
            throw_exception($e->getMessage());
        }
    }
    
    /**
     * @param $table 数据表名
     * @param $param 更新的数据
     * @param $condition 更新的条件
     * @return boolean 成功返回true 失败返回false
     */
    public function think_update($table, $param, $condition){
        try {
            $this->startTrans();
            
            $where = array();
            $bind = array();
            $update = array();
            
            foreach ($condition as $k=>$v){
                $where[$k] = ':w_'.$k;
                $bind[':w_'.$k] = $v;
            }
            
            foreach ($param as $k=>$v){
                $update[$k] = ':u_'.$k;
                $bind[':u_'.$k] = $v;
            }
            
            $this->table($table)->where($where)->bind($bind)->save($update);
            
            if(!$this->commit()){
                $this->rollback();
                return false;
            }else {
                return true;
            }
        } catch (Exception $e) {
            $this->rollback();
            throw_exception($e->getMessage());
        }
    }
    
    /**
     * 注意!注意!注意!使用本方法的数据表,不可再使用thinkphp的add方法,
     * 若使用的thinkphp的add方法或者在其他执行了insert语句,必须更新sequence中维护的数据表的最大id值
     * @param $table 数据表名
     * @param $param 要插入的数据
     * @param $is_auto_increment 数据表主键是否自增
     * @param $is_exist_keyid 数据表主键(或者用于表示数据是否重复的key)是否存在
     * @param string $is_return_id 是否返回当前的主键ID
     * @return boolean 成功返回true或主键ID 失败返回false
     */
    public function think_insert($table, $param, $is_auto_increment=true, $is_exist_keyid=true, $is_return_id=false){
        try {
            $this->startTrans();
            
            $insert = array();
            $bind = array();
            
            if(!$is_auto_increment && $is_exist_keyid){
                //如果主键不是自增,并且存在主键或者非重复key,调用本类中last_sequence_id方法来获取最大id+1,用以存入要插入的数据
                $key = isset($param['table_key']) ? $param['table_key'] : 'id'; //如果自增主键不是id在 $param里传入table_key的值即可 
                $param[$key] = $this->last_sequence_id($table);
            }
            
            foreach ($param as $k => $v){
                $insert[$k] = ':i_'.$k;
                $bind[':i_'.$k] = $v;
            }
            
            $result = $this->table($table)->bind($bind)->add($insert);
            
            if($is_auto_increment){
                //如果是主键,执行sql函数使sequence表中维护的自增id保持最新
                $this->native_select_one("SELECT SETVAL('" . $table . "',".$result.")");
            }
            
            if(!$this->commit()){
                $this->rollback();
                return false;
            }else {
                return $is_return_id === true ? ($is_auto_increment ? $result : $param[$key]) : true;
            }
        } catch (Exception $e) {
            $this->rollback();
            throw_exception($e->getMessage());
        }
    }
    
    /**
     * 获取表最大ID+1
     * @param $table 表名
     */
    public function last_sequence_id($table){
        $sql = "SELECT NEXTVAL('" . $table . "') AS num";
        $result = $this->native_select_one($sql);
        
        if(!$result['num']) {
            throw_exception('获取主键失败:' . $table, '');
        }
        return $result['num'];
    }
    
    /**
     * 原生sql绑定参数
     */
    protected function bindParam($sql, $param){
        if(!empty($param) && !is_array($param)){
            return false;
        }
        
        foreach ($param as $k => $v){
            $bind[] = ":".$k;
            
            if(strpos($v, "'") === 0 && substr($v, -1) == "'"){
                $value[] = $v;
            }else{
                $value[] = "'".$v."'"; //将参数值强制转为带引号的字符串
            }
        }
        
        return str_replace($bind, $value, $sql);
    }
}
最佳答案
评论( 相关
后面还有条评论,点击查看>>