1

関連モデルからデータを取得する必要はありません。モデルの投稿があります また、モデルのコメントもあります。

すべての投稿にはコメントがあります。私はモデル間を関連させます:

class Post
    public function relations()
    {
        return array(
            'comments' => array(self::HAS_MANY, 'Comment', 'post_id')
        );
    }

    public function scopes()
    {
        return array(
            'orderDesc'=>array(
                'order' => 'post_id DESC',
            ),
        );

    }

    public function findAllPosts()
    {
        return $this->orderDesc()->findAll();
    }

db から投稿を受け取った場合、コメントが必要です。問題ありません。

Post::model()->findByPk()

しかし、すべての投稿を取得した場合、コメントは必要ありません

Post::model()->findAllPosts()

しかし、私はコメント付きの投稿を受け取ります。私は思う-データベースには良くない-追加の結合を使用し、関連モデルからのデータの取得を無効にする方法は興味深い。

私はシナリオを通してそうしようとしましたが、メソッド関係で動作を変更しましたが、メソッド関係では常に - $this->scenario が空です。

4

1 に答える 1

3

Yii では、定義されたリレーションはデフォルトでロードされた遅延読み込みです。これは、Yii が関連するモデルをコード内で呼び出した場合にのみ取得することを意味します。

だからあなたがするなら

Post::model()->findAll();

関連するモデル (つまり、コメント) は読み込まれません。しかし、もしあなたが天職なら

Post::model()->findAll();
CVarDumper::dump($posts[0]->comments);

次に、関連するコメントを取得するために 2 番目の DB リクエストが実行されます。これが、コードがコメントを表示する理由です。

関連モデルが必要になることがわかっている場合、最善の解決策は熱心な読み込みを使用することです。これは、初期モデルを読み込む同じリクエストで関連モデルを読み込むことで構成されます。withこれを行うには、コードでメソッドを指定する必要があります。

例:

Post::model()->with('comments')->findAll();

このメソッドwithは、モデルの定義済みスコープまたはデフォルト スコープに配置することもできます。デフォルトのスコープにある場合、モデルがロードされるたびに、関連するモデルが同じリクエストでロードされます。

最後の注意:

熱心な読み込みを使用している場合、関連するモデルを取得するために 1 つの要求が実行されますが、この手法はすべての関係に対して完璧ではありません。

たとえば、があり、プロファイルpostをロードしたい場合、は 1 つしかないため、リクエストは高速になり、1 行だけが返されるため、イーガー ロードは良好です。authorauthor

しかし、あなたはロードしたいcomments. 1 つのリクエストしか実行していないため、多くの同様の情報 ( に関するすべての情報) を含む行がいくつかありますpost。この場合、純粋な熱心な読み込みは最善の解決策ではありません。これらの関係を処理する最善の方法は、関係配列で paramstogetherを false に指定することです。その場合、2 つのリクエストが実行されます。1 つ目は をフェッチしpost、2 つ目は関連する をフェッチしcommentsます。

例:

Post::model()->with('comments' => array('together' => false))->findAll();

出典: Yii ガイド

于 2012-12-26T11:05:41.253 に答える