Отношение MANY_MANY у меня не работает

#many-to-many #yii #relation

#многие ко многим #yii #отношение

Вопрос:

Сейчас я открываю для себя фреймворк 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 со списком всех подписанных на нее игроков, поэтому мой 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 / viewamp;id= 2, я получаю эту ошибку: «ВЫБЕРИТЕ COUNT (*) ИЗ tbl_player t ГДЕ league_id=:LeagueID», поэтому похоже, что отношение не работает. Чего я не понимаю?

Большое спасибо!

Комментарии:

1. Просто предостережение, попробуйте удалить пробел в tbl_league_player(player_id, league_id) Я уже видел некоторые странности с этим раньше.

Ответ №1:

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

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

Комментарии:

1. Привет, приятель, спасибо за твой комментарий. Однако, согласно yiiframework.com/doc/guide/1.1/en / … отношение many_many должно работать через ассоциативную таблицу (в моем случае tbl_league_player) и определенные внешние ключи (которые у меня, надеюсь, правильно). Ваш подход выглядит нормально и должен работать, но я хотел бы в полной мере использовать возможности модели Yii.

Ответ №2:

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

Внутри 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,
    ),
    ));