我在 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()函数,但它不起作用,重新定义的函数没有改变数据集......我需要将所有数据作为一个大块,就好像它是一个表一样。
谢谢!