1

私は今、Yii フレームワークを発見し、リーグを作成してプレイヤーを割り当てることができる単純なアプリケーションを開発しようとしています。これらの関係は多対多です (プレイヤーは多くのリーグに登録でき、1 つのリーグには多くのプレイヤーが含まれます)。したがって、tbl_league、tbl_player、および tbl_league_player の 3 つの db テーブルがあり、次のような外部キーを作成しました。

ALTER TABLE tbl_league_player ADD FOREIGN KEY league_id_idxfk (league_id) REFERENCES tbl_league (id);

ALTER TABLE tbl_league_player ADD FOREIGN KEY player_id_idxfk (player_id) REFERENCES tbl_player (id);

今、私はそれにサブスクライブしているすべてのプレイヤーのリストでリーグを表示しようとしているので、LeagueController の私の actionView は次のように言います:

    public function actionView($id)
{

    $issueDataProvider = new CActiveDataProvider('Player', array(
        'criteria' => array(
            'condition' => 'league_id=:leagueId',
            'params' => array(
                ':leagueId' => $this->loadModel($id)->id
            ),
        ),
        'pagination' => array(
            'pageSize' => 1,
        ),
    ));

    $this->render('view',array(
        'model'=>$this->loadModel($id),
        'issueDataProvider' => $issueDataProvider,
    ));
}

ここでやろうとしているのは、Player テーブルのすべてのプレイヤーを特定のリーグ ID にサブスクライブさせることです。このために、次のように定義されたリレーションを持つ Player モデルがあります。

    public function relations()
{
    // NOTE: you may need to adjust the relation name and the related
    // class name for the relations automatically generated below.
    return array(
        'League' => array(self::MANY_MANY, 'League', 'tbl_league_player(player_id, league_id)'),
    );
}

問題は、たとえば、league/view&id=2 に移動すると、「SELECT COUNT(*) FROM tbl_player tWHERE League_id=:leagueId」というエラーが表示されるため、関係が機能していないように見えることです。私は何が欠けていますか?

どうもありがとう!

4

2 に答える 2

1

したがって、まず、エラーの理由は、WHERE league_id =Player CActiveDataProvider に条件を追加しようとしていて、Player テーブルに League_id 列がないことです。

ビュー内のプレーヤーのリストを取得するには、次のことを行う必要があります。

1) CActiveDataProvider を作成しないでください - ビューに $model を渡すだけです

public function actionView($id)
{ 
  $this->render('view',array(
    'model'=>$this->loadModel($id),
  ));
}

2) 次に、ビューで、MANY_MANY リレーションを遅延ロードし、次のようにループします。

<?php foreach($model->League as $player): ?>
  <?php echo $player->name ?>
<?php endforeach; ?>

「リーグ」関係の「プレーヤー」などの名前を変更します。

本当に CActiveDataProvider を使用する必要がある場合は、リレーションを渡す方法 (またはできる場合) を思い出せませんが、join条件を CActiveDataProvider に手動で追加することで実行できます。

これが役立つことを願っています!乾杯

于 2011-05-30T17:09:11.267 に答える
0

これを試して。

内部 LeagueController

public function actionView($id)
{
    $criteria=new CDbCriteria;
    $criteria->with='League';
    $criteria->together=true;
    $criteria->condition='league_id=:leagueId';
    $criteria->params=array(':leagueId'=>$this->loadModel($id)->id);

    $issueDataProvider = new CActiveDataProvider('Player',array(
    'criteria'=>$criteria,
    ),
    'pagination' => array(
        'pageSize' => 1,
    ),
    ));
于 2011-11-11T10:39:23.970 に答える