入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

yii2.0 基于ActiveRecord 封装的curd操作

创建时间:2017-09-02 投稿人: 浏览次数:553

最近在用yii2.0 进行系统重构,需要一个兼容之前框架的curd 的一种调用方式,所以对activeRecord 类进行了继承和封装,实现基本的curd、强制主从切换等方法,同时兼容ActiveRecord 的原生方法。

代码如下:

<?php

/**
 * Created by PhpStorm.
 * User: wangyaofeng
 * Date: 17-8-11
 * Time: 下午12:06
 */
namespace commoncomponents;
use Yii;
use yiidbActiveRecord;
abstract class ModelBasic extends ActiveRecord
{
    //标志位 是否强制走主库
    protected static $_master = false;
    //标志位 数据库配置对应的key
    protected static $_configKey = "Shop";
    //对应的表明
    protected static $_tableName = "shop";
    //对应的表前缀
    protected static $_tablePrefix = "cc_";
    public  $param = array();
    protected static $_dbArray = array();
    protected $_transaction = null;
    //配置参数
    public function setParam($_configKey,$tableName,$_tablePrefix="cc_"){
        self::$_configKey = $_configKey;
        self::$_tableName = $tableName;
        self::$_tablePrefix = $_tablePrefix;
    }
    //配置表名
    public static function tableName()
    {
        return "{{%".self::$_tableName."}}";
    }
    //配置db主从和前缀配置
    public static function  getDbConfig($configName="Shop",$master=false){
        $config = Yii::$app->params[$configName];
        //应对库相同,表前缀不同的情况
        $config["masterConfig"]["tablePrefix"] = self::$_tablePrefix;
        $config["slaveConfig"]["tablePrefix"] = self::$_tablePrefix;
        $key = md5($configName);
        /*if(!isset(self::$_dbArray[$key])){
            self::$_dbArray[$key] = Yii::createObject($config);
        }*/

        //返回主库实例
        if(!isset(self::$_dbArray[$key])){
            self::$_dbArray[$key] = Yii::createObject($config);
        }
        switch ($master){
            case false:return self::$_dbArray[$key]->getSlave();break;
            case true:return self::$_dbArray[$key]->getMaster();break;
            default:return self::$_dbArray[$key];
        }
        //返回从库实例


    }
    //重写 ActiveRecord 静态方法 根据参数切换主从
    public static function getDb(){
        return self::getDbConfig(self::$_configKey,self::$_master);
    }
    //查询方法
    public  function selectLogic($field,$where,$order,$limit,$page,$count=false,$master=false){
        try{
            //要求强制切主或者 有事务存在的时候 要切回主库
            if($master==true || !empty($this->_transaction)){
                self::$_master = true;
            }else{
                self::$_master = false;
            }
            $offset = ($page-1)*$limit;
            $basic = $this->find()->where($where)->orderBy($order)->limit($limit)->offset($offset)->select($field);
            $result["data"] = $basic->asArray()->all();
            //$sql = $basic->createCommand()->getRawSql();
            if($count==true){
                $result["count"] = $this->find()->where($where)->count("*");
            }
            return $result;
        }catch (Exception $e){
            return $e->getMessage();
        }
    }
    //插入方法 强制切主  如果主键id存在返回主键id,否则返回 true/false
    public  function insertLogic($data = array()){
        self::$_master = true;
        foreach($data as $key=>$val){
            $this->$key = $val;
        }
        $result = $this->insert();
        $insertId = $this->primaryKey;
        if($result==true && !empty($insertId)){
            return $insertId;
        }
        return $result;
    }
    //批量插入方法 强制切主
    public function insertAllLogic($data = array()){
        self::$_master = true;
        $columns = array();
        $rows = array();
        foreach($data as $key =>$val){
            $rows[$key] = array_values($val);
            if(empty($columns)){
                $columns = array_keys($val);
            }
        }
        $basic = self::getDb()->createCommand();
        $result = $basic->batchInsert(self::$_tablePrefix.self::$_tableName,$columns,$rows)->execute();
        //var_dump($basic->getRawSql());
        return $result;
    }
    //更新方法
    public function updateLogic($data,$where){
        self::$_master = true;
        $result = $this->updateAll($data,$where);
        //var_dump($this->find()->createCommand()->getRawSql());
        return $result;
    }
    //update更新 是否带校验
    public function updateLoginc2($data,$where,$runValidation=false){
        self::$_master = true;
        $model = $this->findOne($where);
        foreach($data as $key=>$val){
            $model->$key = $val;
        }
        $result = $model->update($runValidation);
        return $result;
    }
    //删除方法
    public  function deleteLogic($where){
        self::$_master = true;
        $result = $this->deleteAll($where);
        return $result;
    }
    //开启一个事物
    public  function begin(){
        //事物应该在主库才会生效 因为自动走的读写分离,写是主库
        self::$_master = true;
        $this->_transaction  = self::getDb()->beginTransaction();
    }
    //提交一个事物
    public  function commit(){
        if(!empty($this->_transaction)){
            $this->_transaction->commit();
        }
    }
    //回退一个事物
    public  function rollback(){
        if(!empty($this->_transaction)){
            $this->_transaction->rollBack();
        }

    }

}

调用实例:

<?php
/**
 * Created by PhpStorm.
 * User: wangyaofeng
 * Date: 17-8-24
 * Time: 下午5:02
 */

namespace backendmodelsshop;

use commoncomponentsModelBasic;
class AdminRecall extends ModelBasic
{
    /**
     * 初始化 配置 实例
     * @since 2017-08-31
     * @lastModifyTime   2017-08-31
     * @author 
     * @lastModify 
     * @return null
     */
    public function __construct()
    {
        //db配置对应的key
        $this->param["configKey"] = "Shop";
        //表名
        $this->param["tableName"] = "admin_recall";
        //前缀
        $this->param["tablePrefix"] = "cc_";
        //设置配置
        $this->setParam($this->param["configKey"],$this->param["tableName"],$this->param["tablePrefix"]);
    }
    /**
     * 插入 数据 实例
     * @since 2017-08-31
     * @lastModifyTime   2017-08-31
     * @author 
     * @lastModify 
     * @return null
     */
    public function create()
    {
        //开启事物
        $this->begin();
        $time = time();
        $array["valid_starttime"] = $time;
        $array["valid_endtime"] = $time+86400;
        $array["require"] = "test";
        $result = $this->insertLogic($array);
        //回滚测试
        $this->rollback();
        return $result;
    }
    /**
     * 批量插入 数据 实例
     * @since 2017-08-31
     * @lastModifyTime   2017-08-31
     * @author 
     * @lastModify 
     * @return MaxId
     */
    public function createAll()
    {
        $time = time();
        for($i=0;$i<1;$i++){
            $array[$i]["valid_starttime"] = $time;
            $array[$i]["valid_endtime"] = $time+86400;
            $array[$i]["require"] = "test".$i;
        }
        //开始事物
        $this->begin();
        $result = $this->insertAllLogic($array);
        //事物提交实例
        $this->commit();
        return $result;
    }
    /**
     * 更新 数据 实例
     * @since 2017-08-31
     * @lastModifyTime   2017-08-31
     * @author 
     * @lastModify 
     * @return int/num
     */
    public function updateTest()
    {
        $data["require"] = "hi,test";
        $where= array("in","id",array("141","140"));
        $result = $this->updateLogic($data,$where);
        return $result;
    }
    /**
     * 删除 数据 实例
     * @since 2017-08-31
     * @lastModifyTime   2017-08-31
     * @author 
     * @lastModify 
* @return true/false */ public function deleteTest() { $where["id"] = 141; $result = $this->deleteLogic($where); return $result; } /** * 查询 数据 实例 * @since 2017-08-31 * @lastModifyTime 2017-08-31 * @author * @lastModify * @return array */ public function selectTest() { $where = [ "and", ["<", "valid_starttime", 1503575727], [ "and", [">=", "id", "100"], ["<=", "id", "105"], ] ]; $reslut = $this->selectLogic("*",$where," id desc ",10,1,false,false); return $reslut; }}


数据库多库主从配置

<?php
/**
 * Created by PhpStorm.
 * User: wangyaofeng
 * Date: 17-8-11
 * Time: 上午11:10
 */
//数据库配置,支持 主从,多数据库配置
return [
    /*多数据库支持*/
    "Shop" => [
        "class" => "yiidbConnection",
        "tablePrefix" =>"cc_",
        "masterConfig" => [
            "username" => "test",
            "password" => "test1",
            //"dsn" => "mysql:host=127.0.0.1;dbname=shop;port=5500",
            "charset" =>"utf8",
        ],
        "masters" => [
            ["dsn" => "mysql:host=127.0.0.1;dbname=shop;port=5500"],
        ],
        // 配置从服务器
        "slaveConfig" => [
            "username" => "test",
            "password" => "test1",
            "charset"  => "utf8",
            "tablePrefix" =>"cc_",
            "attributes" => [
                PDO::ATTR_TIMEOUT => 10,
            ],
        ],

        // 配置从服务器组
        "slaves" => [
            ["dsn" => "mysql:host=127.0.0.1;dbname=shop;port=5500"],
        ],
    ],
    /*5500  test*/
    "ShopAdmin" =>[
        "class" => "yiidbConnection",
        "tablePrefix" =>"cc_",
        "masterConfig" => [
            "username" => "test_admin",
            "password" => "*********",
            "charset" =>"utf8",
        ],
        "masters" => [
            ["dsn" => "mysql:host="";dbname=shop_admin;port=5500"],
        ],
        // 配置从服务器
        "slaveConfig" => [
            "username" => "test_admin",
            "password" => "**********",
            "charset"  => "utf8",
            "tablePrefix" =>"cc_",
            "attributes" => [
                PDO::ATTR_TIMEOUT => 10,
            ],
        ],

        // 配置从服务器组
        "slaves" => [
            ["dsn" => "mysql:host="";dbname=shop_admin;port=5500"],
        ],
    ]

];

yii2.0 自带ActiveRecord 方法原生支持,只是对其进行了一层封装,可以作为model 基类使用,使得db操作更加灵活,查询(selectLogic)时通过参数还可以强制主从切换,这里是用作重构过程中更好的利用一些代码,而做的一层封装和基础方法收拢,从封装的model基类不在显示支持链表查询,分享出来仅供参考!

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。