【问题标题】:Yii CGridView - Display and paginate from two sourcesYii CGridView - 从两个来源显示和分页
【发布时间】:2013-04-24 13:23:15
【问题描述】:

我有两个数据源

1) Database
2) Memcached or Totally different database

从第一个数据库中,我获取组成员列表 ID(超过 10000 行),在获取列表后,我查询第二个数据库或点击 Memcached 以获取实际详细信息

$connection = Yii::app()->db; 
$sql = 'select user_id,joined_date from group_data where group_id=:group_id ';

$dataProvider = new CSqlDataProvider($sql, array(
                    'keyField' => 'user_id',
                    'sort' => array(
                        'attributes' => array(
                            'user_id',
                            'joined_date'
                        ),
                        'defaultOrder'=>array(
                         'user_id ASC',
                        )
                    ),
                    'pagination' => array(
                        'pageSize' => 30,
                    ),
                    'totalItemCount' => $count,
                ));


$connection_master = Yii::app()->masterdb; 

在上述数据提供者中,我不确定如何包含我的第二个数据库并获取实际用户名,因为它在其他数据库中。没有从一个数据库直接连接到另一个数据库。

这里的问题是分页是基于第一个数据库表(每页 30 条记录),而实际数据来自第二个表。

关于如何实现这一点的任何想法?

谢谢

【问题讨论】:

    标签: yii pagination cgridview


    【解决方案1】:

    您可以构建自己的自定义数据提供程序类。您可以从 CDataProvider 扩展它并实现缺少的 abstract 方法:

    abstract protected function fetchData();
    abstract protected function fetchKeys();
    abstract protected function calculateTotalItemCount();
    

    请注意,您的存储模型已经非常接近这些方法:您将 ID 存储在一个数据库中,将实际数据存储在另一个数据库中。因此,您可以在每种方法中一次只关注一个数据库。

    您将从fetchKeys() 开始。在那里,您需要从第二个数据库中查询键 (=ID)。查看CSqlDataProvider::fetchData() 以了解如何使用$this->getPagination() 中的CPagination 对象来找出当前的limitoffset。如果您需要排序,您还可以检查来自$this->getSort()CSort 对象以了解当前的排序设置。有了所有可用数据,您应该能够在当前请求的结果页面上构建 ID 查询。

    那么在fetchData()你可以通过$this->getKeys()获取这些密钥。您不应该直接调用fetchKeys(),因为getKeys() 的结果来自fetchKeys() 是“缓存的”,所以如果稍后在同一个请求中再次调用它,将不会有另一个查询。使用这些键,您现在可以轻松查询主数据库。结果将代表当前页面上的行。

    最后你必须实现calculateTotalItemCount()。这又很简单:只需查询您的第二个数据库以获取项目总数。

    这就是您需要做的所有事情 - 基类 CDataProvider 中的代码将处理其余部分并按需调用您的方法。

    【讨论】:

    • 感谢您的详细回答。我将尝试实现这一点。对于排序我有一个问题。对于其中一组,我拥有的最大密钥是 133942,它相当于 1 MB 数据。为了对这个组的用户名进行排序,我必须首先获取密钥,并且必须获取数据并且必须对数据进行排序。我刚刚尝试了这个 put in 子句并得到了 max_allowed_pa​​cket 错误(值为 1 GB):)。没有得到理想的排序解决方案..再次感谢
    猜你喜欢
    • 1970-01-01
    • 2013-08-20
    • 2014-07-18
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多