0

Yiiマスター!

ブログがあります。ブログには、著者のリストが記載されたページがあります。著者はAUTHORテーブルに保存されます。私はそれを示すために基本的なYiiウィジェットCListViewを使用しました:

public function actionIndex() {
    $dataProvider = new CActiveDataProvider('Author');
    $this->render('index', array(
        'dataProvider' => $dataProvider,
    ));
}

そしてviews/author / view.phpより:

$this->widget('zii.widgets.CListView', array(
    'dataProvider' => $dataProvider,
    'itemView' => '_view',
));

ただし、著者に関する情報に加えて、このリストには、各著者の5つのランダムな関連記事へのURLが含まれている必要があります。記事のタイトルはARTICLEテーブルに保存されます。今、私は醜い解決策(views / authors / _view.php)を使用しています:

<ul class="experts-node-articles-list">
    <?php $authorArticles = Article::model()->findAllByAttributes(
        array('author_id' => $data->id), 
        array('limit' => '5'
    )); ?>
    <?php foreach ($authorArticles as $item) : ?>
    <li><a href="#"><?php echo CHtml::encode($item->title); ?></a></li>
    <?php endforeach; ?>
</ul>

ビューでモデルを呼び出すため、醜いです。これは、MVCの原則であるIMHOとの競合です。これを真のMVCの方法で実行できますか?モデルの関係やスコープでできるのではないかと思いますが…残念ながらどうしたらいいのかわかりません。

4

1 に答える 1

2

1) Authorモデルでリレーションを作成します。(このようにメソッドを追加/更新できますrelations()

public function relations()
{
    return array(
        .....
        'randomArticles' => array(
            self::HAS_MANY, 
            'Article', 
            'author_id',
            'limit' => 5,
            'order' => 'RAND()',
        ),
        .....
    );
}

2) データプロバイダーはこのようなものでなければなりません。

$dataProvider = new CActiveDataProvider('Author', array(
    'criteria'=>array(
        'with'=>array('randomArticles'),
    ),
));

3) ビュー (views/authors/_view.php) では、次のようなことができます。

foreach($data->randomArticles as $article ) {
    // display $article info, something like below
    $this->renderPartial('_artical_info', array('article' => $article));
}

これにより、多くの SQL クエリが節約されます。

于 2012-10-04T12:11:50.863 に答える