0

我在 MySQL 环境中有一些分片表。我使用 Yii,所以我想为分片添加一些支持。我设法制作了一个自定义 CActiveRecord 类,它是所有分片模型的母亲:

class ShardedActiveRecord extends CActiveRecord{
    private $_shard;

    public function tableName(){
        return get_class($this) . $this->getShard();
    }


    public function setShard($shard) {
        $this->_shard = $shard;
        call_user_func(array(get_class($this), 'model'))->_shard = $shard;

        $this->refreshMetaData();

        return $this;
    }

    public function getShard() {
        if($this->_shard === null){
            $this->setShard("");
        }
        return $this->_shard;
    }

    public function createShardedTable($shard){
        $connection=Yii::app()->db;
        $command = $connection->createCommand("CREATE TABLE IF NOT EXISTS ".get_class($this).$shard." LIKE ".get_class($this));
        $command->execute();
    }
}

插入时一切正常,但是当我需要检索一些数据时,我不知道如何继续。我希望在我的模型中有一个参数,它将是要联合的分片表。这是我希望成为可能的示例:

MyModel::model()->shard("01,"02",03")->findAll();

最终返回最后 3 个表:

$data = new CActiveDataProvider("MyModel")

如果我想选择前 3 个表,则用于检索数据的 sql 如下所示:

SELECT * FROM stats01 
UNION SELECT * FROM stats02
UNION SELECT * FROM stats03

我试图重新定义fetchData()函数,但它不起作用,重新定义的函数没有改变数据集......我需要将所有数据作为一个大块,就好像它是一个表一样。

谢谢!

4

1 回答 1

0

更新:

我找到了解决问题的方法。我在 ShardedActiveRecord 类中创建了一个函数,该函数生成自定义 CActiveRecord 并返回它。这是它的外观:

public function getMergedDataProvider($back){
        $modelArray = array();
        $model = array();
        $now = date("Ym");

        for($i=0; $i<$back; $i++){
            array_push($modelArray, $this->model()->setShard(date("Ym", strtotime("-".$i." month", strtotime($now))))->findAll());
        }

        foreach($modelArray as $ma){
            $model = array_merge($model, $ma);
        }

        $dataProvider = new CActiveDataProvider(get_class($this), array(
            'data'=>$model,
        ));

        return $dataProvider;
    }

我添加了一个参数,可以让我获取最后 3 个表分片(它们与日期相关)。

在需要使用分片模型的操作中,我可以这样调用该函数,并将其用作普通的 CActiveDataProvider:

$dataProvider = MyModel::model()->getMergedDataProvider(3);

我希望这会对某人有所帮助!

于 2014-02-14T16:34:06.467 回答