Witam

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:
  1. <?php
  2. //pilkarz
  3.  
  4. //mecz
  5. class game extends zasob{
  6. public $id;
  7. public $home;
  8. public $away;
  9. public $round;
  10. public $team;
  11.  
  12. public function __construct($data){
  13. $this->home = new gameTeam();
  14. $this->away = new gameTeam();
  15. parent::__construct($data);
  16. }
  17. }
  18.  
  19. //strzelec
  20. class shooter extends zasob {
  21. protected $id;
  22. protected $player;
  23. protected $game;
  24. protected $count;
  25.  
  26. public function getID(){
  27. return $this->id;
  28. }
  29.  
  30. public function __construct($data = NULL){
  31. $this->game = new game(NULL);
  32. $this->player = new player(NULL);
  33. parent::__construct($data);
  34. }
  35. }
  36. ?>

Jak widać obiekt shooter zawiera w sobie obiekt game.
Teraz gdy chcę pobrać mecze przykladowo całej ligi, wywoluje funkcje gameDAO::get():

  1. <?php
  2. public function get($where = NULL){
  3. if($where != NULL)
  4. $where = database::transWhere($where);
  5.  
  6. $sql = "SELECT g.id AS id, g.homeID AS homeID, g.awayID AS awayID,
  7. g.gHome as gHome, g.gAway as gAway, 
  8. t1.name AS homeName, t2.name AS awayName, g.round AS round 
  9. FROM {$this->table} AS g
  10. JOIN teams AS t1 ON t1.id = g.homeID
  11. JOIN teams AS t2 ON t2.id = g.awayID
  12. JOIN rounds ON rounds.id = g.round $where";
  13.  
  14. $games = $this->db->getResult($sql);
  15. return $this->fetchResult($games);
  16. }
  17. ?>


funkcja gameDAO::fetch($row) wrzuca wszystkie dane z bazy danych do obiektu game:

  1. <?php
  2. public function fetch($data){
  3. extract ($data);
  4. $g = new game(array('id'=>$id, 'round'=>$round));
  5.  
  6. $homeTeam = new team(array('id'=>$homeID, 'name'=>$homeName));
  7. $awayTeam = new team(array('id'=>$awayID, 'name'=>$awayName));
  8.  
  9. $g->home->setArray(array('team'=>$homeTeam, 'goals'=>$gHome, 'shooters'=>$sHome));
  10. $g->away->setArray(array('team'=>$awayTeam, 'goals'=>$gAway, 'shooters'=>$sAway));
  11.  
  12. return $g;
  13. }
  14. ?>


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.:
  1. <?php
  2. // tutaj pobieram tylko id z tabeli meczy
  3. $shooters = shooterDAO::get();
  4. foreach($shooters as $s){
  5. // a tutaj pobieram juz caly mecz
  6. $s->game = gameDAO::getByID($s->game->id)
  7. }
  8. ?>

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 winksmiley.jpg