0

以下の2つのスニップから推測できるように、パーツの詳細を表示するときにカテゴリテーブルを参照します。

パーツモデル:

public function relations()    {
    return array(
        'category' => array(self::BELONGS_TO, 'Category', 'fid_caty2') );
}

カテゴリモデル:

public function relations()    {
    return array('part' => array(self::HAS_MANY, 'Part', 'fid_caty2') );
}

ビューで参照される値をレンダリングするこの方法を学びました。

echo CHtml::encode($data->category->name_caty2);

他にもいくつかの方法を見つけましたが、それらはすべてビューで行われます。モデルは関係を設定するので、なぜ参照値をモデルのに含めるべきではないのCActiveRecordですか?これはまさに私たちがモデルのために予約した種類のクランチだと思いました。ビューでそれを解決することは奇妙に思えます、そして多くの余分な仕事。

私が正しい場合、モデルビューでそれを機能させるにはどうすればよいですか?または、MVCの理解に修正が必要ですか?

これはどう

public function loadModel($id)
{   $model=Part::model()->findByPk($id);
    if($model===null)
        throw new CHttpException(404,'The requested page does not exist.'); 
    return $model;
}

これがコントローラーページにあります。ロード時に参照値をモデルに忍び込ませることはできますか?

4

1 に答える 1

2

Yiiは遅延読み込みを使用します。つまり、必要なモデルのみを読み込むため、setステートメントに必要なテーブルのみをクエリします。

たとえば、コントローラでパーツモデルをプルする場合。

$data = Part::model()->findAll($criteria);

明示的に必要とされていないため、リレーションをプルすることはありません。また、すでに述べたように、ビュー内のコードもプルします。

$data->category->name_caty2;

別のクエリを実行しますが、ビューでそれを実行したくない場合は、ビジネスロジックをビューに表示しないようにする必要があります。

これを回避する方法は、Yiiの積極的な読み込みを使用することです(上記の遅延読み込みとは対照的です)。マニュアルに記載されているように;

積極的な読み込みアプローチでは、関連するARインスタンスをメインのARインスタンスと一緒に取得します。これは、with()メソッドをARのfindまたはfindAllメソッドの1つと一緒に使用することによって実現されます。例えば、

$ posts = Post :: model()-> with('author')-> findAll();

したがって、あなたの場合は、を使用する必要があります。

$data = Part::model()->with('category')->findAll($criteria);
于 2012-08-26T09:51:02.747 に答える