我有两个数据源
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条记录),实际数据来自第二个表。
关于如何实现这个的任何想法?
谢谢
答案 0 :(得分:1)
您可以构建自己的自定义数据提供程序类。您可以从CDataProvider
扩展它并实现缺少的abstract
方法:
abstract protected function fetchData();
abstract protected function fetchKeys();
abstract protected function calculateTotalItemCount();
请注意,您的存储模型已经非常接近这些方法:您将ID存储在一个数据库中,将实际数据存储在另一个数据库中。因此,您可以在每种方法中一次关注一个数据库。
你从fetchKeys()
开始。在那里,您需要从第二个数据库中查询键(= ID)。请查看CSqlDataProvider::fetchData()
,了解如何使用$this->getPagination()
中的CPagination
对象查找当前limit
和offset
。如果您需要排序,还需要检查来自$this->getSort()
的{{3}}对象以获取当前排序设置。有了所有可用数据,您应该能够在当前请求的结果页面上构建ID查询。
然后在CSort
中,您可以通过$this->getKeys()
获取这些密钥。您不应直接致电fetchKeys()
,因为fetchKeys()
CDataProvider
的结果是“缓存”,因此如果稍后在同一请求中再次调用,则不会再有其他查询。使用这些键,您现在可以轻松查询主数据库。结果将代表当前页面上的行。
最后,您必须实施fetchData()
。这很容易再次:只需查询第二个数据库中的项目总数。
这就是你需要做的全部 - 基础{{1}}课程中的代码将处理其余部分并按需调用你的方法。