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