我现在正在发现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 “所以看起来关系不起作用。我错过了什么?
非常感谢!
答案 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,
),
));