1

我有两个数据源

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 条记录),实际数据来自第二个表。

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

谢谢你

4

1 回答 1

1

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

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

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

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

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

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

这就是您需要做的全部 - 基CDataProvider类中的代码将负责其余的工作并按需调用您的方法。

于 2013-04-30T16:33:26.330 回答