Yii CGridView - 显示和分页来自两个来源

时间:2013-04-30 15:00:14

标签: yii pagination cgridview

我有两个数据源

1) Database
2) Memcached or Totally different database

从第一个数据库我得到组成员列表ID(超过1万行),在获取列表后我查询第二个数据库或点击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条记录),实际数据来自第二个表。

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

谢谢

1 个答案:

答案 0 :(得分: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()的{​​{3}}对象以获取当前排序设置。有了所有可用数据,您应该能够在当前请求的结果页面上构建ID查询。

然后在CSort中,您可以通过$this->getKeys()获取这些密钥。您不应直接致电fetchKeys(),因为fetchKeys() CDataProvider的结果是“缓存”,因此如果稍后在同一请求中再次调用,则不会再有其他查询。使用这些键,您现在可以轻松查询主数据库。结果将代表当前页面上的行。

最后,您必须实施fetchData()。这很容易再次:只需查询第二个数据库中的项目总数。

这就是你需要做的全部 - 基础{{1}}课程中的代码将处理其余部分并按需调用你的方法。