OOP - statysytki sportowe

0

Zawodnik - Tabela_A i Obiekt_A
Przypisanie zawodnika do drużyny - Tabela_B i Obiekt_B
Przypisanie zawodnika do meczu - Tabela_C i Obiekt_C

Oczywiście Tabele są ze sobą powiązane:

Tabela_A.player_id = Tabela_B.player_id
Tabela_B.match_id = Tabela_C.match_id
Tabela_C.pos_id

Sytuacja wygląda następująco.

W profilu zawodnika znam id z Tabeli A.
W spisie drużyny znam id z Tabeli B
W samym meczu znam id z Tabeli C.

Jak widać, nie zawsze znam na starcie id z tabeli_A,
Czasami muszę wyciągać je z Obiektu_B i potem Obiektu_A.

Pytanie:
Jak ugryźć to poprawnie, aby wszystko wyglądało w pełni OOP i nie sprawiało w przyszłości problemu

**Wariant I. **

$A = new A();
$B = new B();
$C = new C();

$A->set_id(1)->load_data();
$B->set_player_id( $A->get_id() )->load_data();

echo $A->get_name() . ' '. $B->get_nr();

$C->set_player_id($B->get_match_id())->load_data();
echo $C->get_min();
 

Wariant II.
wychodząc z meczu:

$C = new C();
$C->set_id (666)->load_data();

$C->match_obj
   ->set_match_id($C->get_id) //zwracamy obiekt B
   ->load_data_by_match_id()
$C->player_obj
   ->set_id($C->match_obj->get_player_id()) //zwracamy obiekt A
   ->load_data();


echo $C->get_min();
echo $C->player_obj->get_name() . ' '. $C->match_obj->get_nr();

Czy może jeszcze inaczej?

Nie chodzi mi o to, że ktoś z szanownego Grona napisze za mnie ten kod, chodzi raczej o wskazanie właściwej drogi.

0

mógłbyś rozpisać dokładnie jak wyglądają tabele?
bo z tego co napisałeś wynika imo że Obiekt_B reprezentuje tylko Tabelę_B która ma tylko dwa pola wiążące dokładnie jednego zawodnika z jedną drużyną, a w C jednego zawodnika z jednym meczem
a jeśli tak to lepiej raczej w Tabeli A dorobić dwa pola z id drużyny i meczu

ogólnie dobre OOP można poznać po tym że kod wygląda prawie jak zdanie
a ten Twój jest raczej zagmatwany i ciężki do ogarnięcia

0
gdfgdfg napisał(a)

mógłbyś rozpisać dokładnie jak wyglądają tabele?
bo z tego co napisałeś wynika imo że Obiekt_B reprezentuje tylko Tabelę_B która ma tylko dwa pola wiążące dokładnie jednego zawodnika z jedną drużyną, a w C jednego zawodnika z jednym meczem
a jeśli tak to lepiej raczej w Tabeli A dorobić dwa pola z id drużyny i meczu

Nie były to wszystkie pola tabeli - tabela jest zaprojektowana w miarę dobrze - wszystkie dane w niej zawarte są potrzebne na poziomie na którym wystepują.

Kod SQL poniżej

gdfgdfg napisał(a)

ogólnie dobre OOP można poznać po tym że kod wygląda prawie jak zdanie
a ten Twój jest raczej zagmatwany i ciężki do ogarnięcia

Zastosowałem entery w celu lepszej przejrzystości.

Poza tym szukam optymalnego rozwiązania.
Tak jak napisałem - nie zawsze mam dane z Tabeli A, czasami mam dane z Tabeli B lub C.

CREATE TABLE `liga_players` (
  `id` int(10) NOT NULL auto_increment,
  `name` varchar(200) collate utf8_unicode_ci NOT NULL,
  `surname` varchar(200) collate utf8_unicode_ci NOT NULL,
  `typ` tinyint(2) NOT NULL,
  `foto` varchar(200) collate utf8_unicode_ci NOT NULL,
  `foto_source` varchar(255) collate utf8_unicode_ci default NULL,
  `birth_date` date NOT NULL,
  `birth_place` varchar(200) character set utf8 NOT NULL,
  `country` varchar(200) collate utf8_unicode_ci NOT NULL,
  `height` float(5,2) NOT NULL,
  `weight` float(5,2) NOT NULL,
  `position` varchar(200) collate utf8_unicode_ci NOT NULL,
  `club_prev` varchar(200) collate utf8_unicode_ci NOT NULL,
  `info` text collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `typ` (`typ`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1265 ;


CREATE TABLE `liga_players_position` (
  `id` int(10) NOT NULL auto_increment,
  `player_id` int(10) NOT NULL,
  `pos_id` int(10) NOT NULL,
  `number` int(11) default NULL,
  `mode` tinyint(4) NOT NULL,
  `info` text collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `pos_id` (`pos_id`),
  KEY `player_id` (`player_id`),
  KEY `mode` (`mode`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2184 ;

CREATE TABLE `liga_scores_details` (
  `det_id` int(10) unsigned NOT NULL auto_increment,
  `spos_id` int(10) NOT NULL,
  `det_min` int(3) NOT NULL,
  `det_typ` varchar(50) collate utf8_unicode_ci NOT NULL,
  `det_info` varchar(500) collate utf8_unicode_ci NOT NULL,
  `det_other` varchar(100) collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`det_id`),
  KEY `spos_id` (`spos_id`,`det_typ`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=7110 ;

CREATE TABLE `liga_scores_position` (
  `spos_id` int(10) NOT NULL auto_increment,
  `lpp_id` int(10) NOT NULL,
  `score_id` int(10) NOT NULL,
  `spos_start` float(3,0) default NULL,
  `spos_stop` float(3,0) default NULL,
  `spos_xy` varchar(20) collate utf8_unicode_ci default NULL,
  `spos_info` tinytext collate utf8_unicode_ci,
  PRIMARY KEY  (`spos_id`),
  KEY `lpp_id` (`lpp_id`,`score_id`),
  KEY `score_id` (`score_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=11560 ;


ALTER TABLE `liga_players_position`
  ADD CONSTRAINT `liga_players_position_ibfk_5` FOREIGN KEY (`player_id`) REFERENCES `liga_players` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `liga_players_position_ibfk_6` FOREIGN KEY (`pos_id`) REFERENCES `liga_table_position` (`pos_id`) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE `liga_scores_details`
  ADD CONSTRAINT `liga_scores_details_ibfk_1` FOREIGN KEY (`spos_id`) REFERENCES `liga_scores_position` (`spos_id`) ON DELETE CASCADE ON UPDATE CASCADE;

ALTER TABLE `liga_scores_position`
  ADD CONSTRAINT `liga_scores_position_ibfk_5` FOREIGN KEY (`lpp_id`) REFERENCES `liga_players_position` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `liga_scores_position_ibfk_6` FOREIGN KEY (`score_id`) REFERENCES `liga_scores` (`score_id`) ON DELETE CASCADE ON UPDATE CASCADE;

1 użytkowników online, w tym zalogowanych: 0, gości: 1