在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();
最后返回最后三个表:
$data =新CActiveDataProvider("MyModel")
如果我想选择前3个表,用于检索数据库的sql如下所示:
SELECT * FROM stats01
UNION SELECT * FROM stats02
UNION SELECT * FROM stats03我试图重新定义fetchData()函数,但是它没有工作,重新定义的函数没有改变数据集.我需要所有的数据作为一个大块,就像它是一个单一的桌子。
谢谢!
发布于 2014-02-14 16:34:06
更新:
我找到了解决这个问题的办法。我在我的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);
我希望这能帮到别人!
https://stackoverflow.com/questions/21738134
复制相似问题