アプリケーションで貪欲なロードを使用します。 投稿とカテゴリを持つ2つのテーブルがあるとします。 各投稿には、1つ以上の投稿のカテゴリを持つ1つのカテゴリを含めることができます。
これらのテーブルのモデル、コントローラー、ビューをスクランブルするとします。 投稿のリストに記入します。 カテゴリー名自体は、カテゴリーIDではなく、カテゴリー列に表示されることに注意してください。
GridViewを次のように変更することで、ビューに「views / post / index.php」というカテゴリ名を表示できます。
<?php ... use app\models\Category; ?> <?= GridView::widget([ 'dataProvider' => $dataProvider, 'filterModel' => $searchModel, 'columns' => [ ['class' => 'yii\grid\SerialColumn'], 'id', [ 'attribute' => 'category_id', 'filter' => Category::find()->select(['name', 'id'])->indexBy('id')->column(), 'value' => 'category.name', ], 'name', 'content:ntext', ['class' => 'yii\grid\ActionColumn'], ], ]); ?> // 'attribute' => 'category_id', category_id, 'value' => 'category.name', name // 'filter' => Category::find()->select(['name', 'id'])->indexBy('id')->column(), -- // 'value' => 'category.name',
これはまさに、貪欲なロードが役立つ場所です。 実際、SQLを見ると、アプリケーションのクエリです。
この種類のカテゴリテーブルから多くのクエリが表示されます。
SELECT * FROM `sb_category` WHERE `id`=x
ここで、xは投稿のID-category_idです。 ページに100、500、1000の投稿が表示されている場合、投稿テーブルには同じ数の選択があります。 この場合、スクリプトの実行時間を見ると、データベース内のクエリはすぐに実行されます。 ただし、リソースを節約できる場合は、これを活用してください。 これを行うには、「貪欲なダウンロード」を作成しました。 貪欲な負荷は、テーブルが接続されているかのように、冗長データを伴う負荷です。
アプリ\モデル\ PostSearcモデルの検索メソッドで、withメソッドを使用して貪欲な読み込みを追加します
public function search($params) { $query = Post::find();
public function search($params) { $query = Post::find()->with(['category']);
その後、結果を確認します。
これで、データベース内の多数のクエリの代わりに、2つしか取得できません。psotおよびcategoryテーブルからのデータの選択。
withメソッドはpostテーブルからすべてのcategory_idフィールドを収集し、データベースで1つのクエリを作成し、WHERE `id` IN(1、2、3、4、5)条件ですべてのカテゴリを取得します。 つまり、最初の投稿選択にあるすべてのIDがどこにリストされているか
SELECT * FROM `sb_post` LIMIT 20
フィルタリングを機能させるには、GridViewで並べ替えます。 with()の代わりに、joinWith()を使用します。
joinWith()は、joinを使用して追加のテーブルを積極的にロードおよび結合します。これにより、条件の追加、並べ替えが可能になります。