Yii分表插件Par(Partition Active Record)[原创]

PAR

An extension of Yii ORM to support partition tables.

特点

基于表的一个字段计算hash并分表,方便使用,初始化时指定需要hash的字段即可。

使用方法

将par.php放在components目录下,需要分表支持的model继承Par类,并定义$tablename静态变量作为表的未分表名称。代码如下:

Controller

class IndexController extends Controller
{
    public function actionTest()
    {
        $test = new Test();
        $test->name='a test name';
        $test->save();

        {{or}}

        $test = Test::model()->findByPk(3);
        var_dump($test->name);

    }
}

Model

class Test extends Par
{
    public static $tablename = 'test';    //未分表前的表名

    public static function model($opts = null, $entry = array(), $className=__CLASS__)
    {
        return parent::model($opts, $entry, $className);
    }



    public function rules()
    {
        return array(
            array('url, name', 'safe'),
        );
    }
}

源码

class Par extends CActiveRecord
{
    const STRING_HASH = 1;
    const DATE_HASH = 2;

    protected static $tablename = 'pars';
    protected $hashnum = 10;
    protected $hashtype = self::DATE_HASH;

    protected $_key;

    /**
    * Constructor.
    * @param array $entry=array($key=>$value) key is the partition field name.
    * @param array $opts some optitions: hash_num=>the hash num default 10.
    */
    public function __construct($opts = array(), $entry = array()){
        if($opts === null){
            return;
        }
        $this->parseParams($opts, $entry);
        parent::__construct();
    }

    public static function model($opts = null, $entry = array(), $className=__CLASS__)
    {
        $model = new $className($opts, $entry);
        return $model;
    }

    public function tableName()
    {
        return static::$tablename;
    }

    protected function parseParams($opts, $entry){
        if(isset($opts['hash_num'])){
            $this->hashnum = $opts['hash_num'];
        }
        if(isset($opts['hash_type'])){
            $this->hashtype = $opts['hash_type'];
        }
        if(!empty($entry)){
            $key = key($entry);
            $value = $entry[$key];
            $this->_key = $value;
        }
        static::$tablename .= '_'.$this->getHashTablename();
    }

    //根据字符串hash到十进制,计算表hash值
    protected function getHashTablename(){
        switch($this->hashtype){
        case self::STRING_HASH:
            $str = base_convert(md5($this->_key),16, 10);
            $key_hash = substr($str, strlen($str)-1, 1);
            $table_hash = $key_hash % $this->hashnum;
            break;
        case self::DATE_HASH:
            $table_hash = date('Y_m');
            break;
        default:
            break;
        }

        return $table_hash;
    }
}
源码地址:https://github.com/fate2013/par

转载于:https://my.oschina.net/u/1243917/blog/150277

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值