OOP - statysytki sportowe

Odpowiedz Nowy wątek
2011-09-05 21:55
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();
</code></pre>
<p><strong>Wariant II.</strong><br />
wychodząc z meczu:</p>
<pre><code class="language-php">$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.

edytowany 1x, ostatnio: marins, 2011-09-05 21:55

Pozostało 580 znaków

2011-09-05 23:17
gdfgdfg
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

Pozostało 580 znaków

2011-09-06 21:08
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;
edytowany 1x, ostatnio: marins, 2011-09-06 21:08

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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