Mój problem wygląda następująco:
Mam w bazie danych tabele: zawodnicy, mecze, druzyny, strzelcy(id,zawodnikId,meczId,liczbaGoli)
Obiekty meczu i strzelca wygladaja tak:
<?php //pilkarz //mecz class game extends zasob{ public $id; public $home; public $away; public $round; public $team; public function __construct($data){ $this->home = new gameTeam(); $this->away = new gameTeam(); parent::__construct($data); } } //strzelec class shooter extends zasob { protected $id; protected $player; protected $game; protected $count; public function getID(){ return $this->id; } public function __construct($data = NULL){ $this->game = new game(NULL); $this->player = new player(NULL); parent::__construct($data); } } ?>
Jak widać obiekt shooter zawiera w sobie obiekt game.
Teraz gdy chcę pobrać mecze przykladowo całej ligi, wywoluje funkcje gameDAO::get():
<?php public function get($where = NULL){ if($where != NULL) $where = database::transWhere($where); $sql = "SELECT g.id AS id, g.homeID AS homeID, g.awayID AS awayID, g.gHome as gHome, g.gAway as gAway, t1.name AS homeName, t2.name AS awayName, g.round AS round FROM {$this->table} AS g JOIN teams AS t1 ON t1.id = g.homeID JOIN teams AS t2 ON t2.id = g.awayID JOIN rounds ON rounds.id = g.round $where"; $games = $this->db->getResult($sql); return $this->fetchResult($games); } ?>
funkcja gameDAO::fetch($row) wrzuca wszystkie dane z bazy danych do obiektu game:
<?php public function fetch($data){ return $g; } ?>
Teraz gdy chciałbym pobrać np. gole pilkarza w poszczegolnych meczach i wyswietlic wszystkie mecze w ktorych strzelil i ile, to zapytanie sql w funkcji shooterDAO::get() musialo by pobierac wszystkie te dane ktore pobiera gameDAO::get i jeszcze do tego dodatkowe, bo shooter zawiera w sobie obiekt game. Tak samo z funkcją shooterDAO::fetch ktora musialaby niedosc ze wrzucac wszystko do obiektu game, to jeszcze do pozostalych wlasciwosci.
I właśnie czy nie lepiej w funkcji shooterDAO::get() pobierać tylko "goły" rekord z tabeli shooters i wkleic dane do obiektu, a pozniej funkcją gameDAO::getByID($id) pobrać mecz i wkleic go do shooter->game? np.:
<?php // tutaj pobieram tylko id z tabeli meczy $shooters = shooterDAO::get(); foreach($shooters as $s){ // a tutaj pobieram juz caly mecz $s->game = gameDAO::getByID($s->game->id) } ?>
Wtedy wychodzi dużo więcej zapytań do bazy danych, ale nie trzeba wielokrotnie powtarzać kodu zapytań i funkcji.
Chyba pokręciłem ale mam nadzieję, że nie za bardzo.
Z góry dzięki, Pozdrawiam
