Yii2の貪欲な読み込み、それが何であるかを理解したい人のために

この投稿は、「遅延読み込み」の代わりに「貪欲な読み込み」を使用する必要がある理由を示しており、理想的であると主張していません。 また、YII2の研究の初心者にはより適した専門家には興味がありません。



アプリケーションで貪欲なロードを使用します。 投稿とカテゴリを持つ2つのテーブルがあるとします。 各投稿には、1つ以上の投稿のカテゴリを持つ1つのカテゴリを含めることができます。



bd-mediarise.ru





これらのテーブルのモデル、コントローラー、ビューをスクランブルするとします。 投稿のリストに記入します。 カテゴリー名自体は、カテゴリーIDではなく、カテゴリー列に表示されることに注意してください。



bd-mediarise.ru



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を見ると、アプリケーションのクエリです。



bd-mediarise.ru



この種類のカテゴリテーブルから多くのクエリが表示されます。

 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']);
      
      







その後、結果を確認します。



bd-mediarise.ru



これで、データベース内の多数のクエリの代わりに、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を使用して追加のテーブルを積極的にロードおよび結合します。これにより、条件の追加、並べ替えが可能になります。



All Articles