1

我现在正在发现 Yii 框架,并尝试开发一个简单的应用程序,该应用程序允许创建联赛并将玩家分配给它。它们之间的关系是多对多的(一个玩家可以订阅多个联赛,一个联赛包含多个玩家)。所以我有三个数据库表 - tbl_league、tbl_player 和 tbl_league_player,我创建了这样的外键:

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

现在我正在尝试显示 League 以及所有订阅它的玩家的列表,所以我在 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 回答