1

2 つのデータ ソースがあります

1) Database
2) Memcached or Totally different database

最初のデータベースからグループ メンバーのリスト ID (1 万行以上) を取得し、リストを取得した後、2 番目のデータベースにクエリを実行するか、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; 

上記のデータ プロバイダーでは、2 番目のデータベースを含めて実際のユーザー名を取得する方法がわかりません。これは、別のデータベースにあるためです。あるデータベースから別のデータベースへの直接接続はありません。

ここでの問題は、ページネーションが最初のデータベース テーブル (ページあたり 30 レコード) に基づいており、実際のデータが 2 番目のテーブルからのものであることです。

これを実装する方法について何か考えはありますか?

ありがとうございました

4

1 に答える 1

1

独自のカスタム データ プロバイダー クラスを作成できます。CDataProvider不足しているabstractメソッドから拡張して実装できます。

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

ストレージ モデルはすでにこれらの方法に非常に近いことに注意してください。ID を 1 つのデータベースに格納し、実際のデータを別のデータベースに格納します。したがって、これらの各方法で一度に 1 つの DB に集中できます。

から始めfetchKeys()ます。そこで、2 番目のデータベースからキー (=ID) を照会する必要があります。からオブジェクトCSqlDataProvider::fetchData()を使用して現在のとを調べる方法については、 を参照してください。並べ替えが必要な場合は、オブジェクトの現在の並べ替え設定も調べます。利用可能なすべてのデータを使用して、現在リクエストされている結果ページで ID のクエリを作成できるはずです。CPagination$this->getPagination()limitoffsetCSort$this->getSort()

次に、fetchData()からこれらのキーを取得できます$this->getKeys()。からの結果は「キャッシュ」されているfetchKeys()ため、直接呼び出すべきではありません。同じリクエストで後で再度呼び出された場合、別のクエリはありません。そのキーを使用して、メイン データベースに簡単にクエリを実行できるようになりました。結果は、現在のページの行を表します。getKeys()fetchKeys()

最後に、実装する必要がありますcalculateTotalItemCount()。これも非常に簡単です。アイテムの総数について 2 番目の DB にクエリを実行するだけです。

基本CDataProviderクラスのコードが残りを処理し、必要に応じてメソッドを呼び出します。

于 2013-04-30T16:33:26.330 に答える