首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CActiveRecord联合

CActiveRecord联合
EN

Stack Overflow用户
提问于 2014-02-12 19:48:58
回答 1查看 167关注 0票数 0

在MySQL环境中,我有一些切碎的表。我使用Yii,所以我想添加一些对切分的支持。我已经成功地制作了一个自定义CActiveRecord类,它是所有切分模型的母类:

代码语言:javascript
复制
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如下所示:

代码语言:javascript
复制
SELECT * FROM stats01 
UNION SELECT * FROM stats02
UNION SELECT * FROM stats03

我试图重新定义fetchData()函数,但是它没有工作,重新定义的函数没有改变数据集.我需要所有的数据作为一个大块,就像它是一个单一的桌子。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-14 16:34:06

更新:

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

代码语言:javascript
复制
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);

我希望这能帮到别人!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21738134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档