MANY_MANY关系对我不起作用

时间:2011-05-28 21:07:34

标签: many-to-many yii relation

我现在正在发现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);

现在我正在尝试使用所有订阅它的玩家列表显示联盟,所以我在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,
    ));
}

我在这里要做的是让所有玩家表中的玩家订阅特定的联盟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 t WHERE league_id =:leagueId “所以看起来关系不起作用。我错过了什么?

非常感谢!

2 个答案:

答案 0 :(得分:1)

因此,首先,错误的原因是您向播放器CActiveDataProvider添加了WHERE league_id =条件,而您的播放器表没有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。

我希望这有帮助!干杯

答案 1 :(得分:0)

试试这个。

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