2011-05-28 70 views
1

我現在發現了Yii框架,並嘗試開發一個簡單的應用程序,該應用程序允許創建聯盟並將玩家分配給它。這些關係是多對多的(一個球員可以訂閱很多聯賽,一個聯盟包含很多球員)。所以,我有三個數據庫表 - tbl_league,tbl_player和tbl_league_player和我創建外鍵是這樣的:MANY_MANY關係不適用於我

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玩家表中獲取所有玩家。爲此,我有關係的人物模型是這樣定義的:

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)'), 
    ); 
} 

的問題是,我去,例如,聯盟/視圖& ID = 2,我收到此錯誤:「SELECT COUNT(* )從tbl_playert WHERE league_id =:leagueId「因此看起來關係不起作用。我錯過了什麼?

非常感謝!

+0

只是一個警告,儘量去除''tbl_league_player我以前見過一些怪事與空間(player_id,league_id)。 – Paystey 2011-11-16 08:50:04

回答

1

因此,首先,錯誤的原因是您要爲播放器CActiveDataProvider添加WHERE league_id =條件,並且您的播放器表沒有league_id列。

你應該做些什麼來得到視圖中的球員名單是:

1)不作CActiveDataProvider - 只是在$模型傳遞到您的視圖

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 ...我不記得如何(或者如果可以的話)傳遞關係,但您可以手動將它添加到您的CActiveDataProvider中。

我希望這有助於!乾杯

+0

你好隊友, 感謝您的評論。然而,根據http://www.yiiframework.com/doc/guide/1.1/en/database.arr#declaring-relationship,many_many關係應該通過關聯表(在我的情況下爲tbl_league_player)和外鍵定義(它我有,希望,正確)。你的方法看起來很好,應該可以工作,但我想充分利用Yii模型的功能。 – petiar 2011-05-31 07:58:15

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