After changing relations in models Player and Team the way you wrote above I get it working correct with the code below:
/** @var Team[] $teams */
$teams = Team::find()
->with(['players', 'teamPlayer'])
->all();
foreach ($teams as $team) {
echo $team->team_label . '<br />';
foreach ($team->players as $key => $player) {
echo ' ... ' . $player->player_label . ' -> ' . $team->teamPlayer[$key]->start_date . '<br />';
}
}
Does Gii generate wrong relations by foreign key constraints or do I make mistake in table structure? Here is my db dump:
CREATE TABLE IF NOT EXISTS `player` (
`player_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`player_label` varchar(255) DEFAULT NULL,
PRIMARY KEY (`player_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
INSERT INTO `player` (`player_id`, `player_label`) VALUES
(1, 'Player 1'),
(2, 'Player 2'),
(3, 'Player 3');
-- --------------------------------------------------------
CREATE TABLE IF NOT EXISTS `team` (
`team_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`team_label` varchar(255) DEFAULT NULL,
PRIMARY KEY (`team_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
INSERT INTO `team` (`team_id`, `team_label`) VALUES
(1, 'Team 1'),
(2, 'Team 2'),
(3, 'Team 3');
-- --------------------------------------------------------
CREATE TABLE IF NOT EXISTS `team_player` (
`team_id` int(11) unsigned NOT NULL,
`player_id` int(11) unsigned NOT NULL,
`start_date` varchar(255) DEFAULT NULL,
PRIMARY KEY (`team_id`,`player_id`),
KEY `player_id` (`player_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `team_player` (`team_id`, `player_id`, `start_date`) VALUES
(1, 1, 't1 p1'),
(1, 2, 't1 p2'),
(2, 1, 't2 p1'),
(2, 3, 't2 p3'),
(3, 3, 't3 p3');
ALTER TABLE `team_player`
ADD CONSTRAINT `team_player_ibfk_2` FOREIGN KEY (`player_id`) REFERENCES `player` (`player_id`) ON DELETE NO ACTION ON UPDATE CASCADE,
ADD CONSTRAINT `team_player_ibfk_1` FOREIGN KEY (`team_id`) REFERENCES `team` (`team_id`) ON DELETE NO ACTION ON UPDATE CASCADE;