Отношение MANY_MANY не работает для меня - PullRequest
1 голос
/ 29 мая 2011

Сейчас я открываю фреймворк 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);

Теперь я пытаюсь отобразить Лигу со списком всех подписавшихся на нее игроков, поэтому мой actionView в LeagueController говорит:

    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 с отношением, определенным так:

    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 ]

1 голос
/ 30 мая 2011

Итак, во-первых, причина ошибки заключается в том, что вы добавляете условие WHERE league_id = в свой Player CActiveDataProvider, а в таблице Player нет столбца 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 ... Я не могу вспомнить, как (или если вы можете) передать отношение, но вы можете сделать это, вручную добавив критерии join к вашему CActiveDataProvider.

Надеюсь, это поможет! Приветствия

0 голосов
/ 11 ноября 2011

попробуйте это.

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