Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [ZF]Skojarzenia tabel
amii
post
Post #1





Grupa: Zarejestrowani
Postów: 728
Pomógł: 76
Dołączył: 12.06.2009

Ostrzeżenie: (0%)
-----


Mam problem, którego nie mogę rozgryźć. Mam 4 table: users, trainings, training_instance oraz training_instance_user. Table są powiązane tak:

Do każdego jednego treningu może należeć wiele jego instancji
- Tabela trainings powiązana relacją 1:n z tabelą training_instance

Każdy użytkownik może brać udział w dowolnej ilości treningów i do każdego treningu może należeć wielu użytkowników
- Tabela trainings powiązana relacją n:m (wiele do wielu) z tabelą users za pomocą tabeli haszującej training_instance_user
- Tabela users powiązana relacją n:m z tabelą trainings za pomocą tabeli haszującej training_instance_user


Potrzebuję wypisać dane z tabel trainings oraz trainings_instance danego użytkownika kiedy jednocześnie spełnione są warunki:
training_instance_user->status =1
training_instance_user->canceled = 0
training_instance->date_start <= NOW()

Na razie robię to tak w kontrolerze przekazuję do widoku rekord z id użytkownika. W widoku z kolei pobieram trainings skojarzone z użytkownikiem, dzięki metodzie getInstance pobieram również skojarzoną training_instance i wyświetlam datę. Pytanie jak i gdzie dorzucić te dodatkowe warunki do zapytania ?
  1. //kontroler
  2. //pobieramy rekord dla zalogowanego usera
  3. $user_model = new Application_Model_DbTable_Users();
  4. $s = $user_model->select()->where('id = ?', $this->view->login->id);
  5. //przekazujemy dane zalogowanego usera do widoku
  6. $this->view->user = $user_model->fetchRow($s);
  7.  
  8. //widok
  9. foreach ($this->user->getCourses() as $kursy) {
  10. $data = $kursy->getInstance()->current()->date_start;
  11. echo "<tr><td>$kursy->title</td><td>$kursy->category</td><td>$data</td></tr>";
  12. }
  13.  
  14.  
  15. //pojedynczy rekord z tabeli users class Application_Model_DbTable_Users_Row extends Zend_Db_Table_Row
  16. //metoda pobiera liste treningów (z tabeli trainings) skojarzonych z danym uzytkownikiem (z tabeli users). Zwracany jest obiekt Zend_Db_Table_Rowset
  17. public function getCourses() {
  18. return $this->findManyToManyRowset(
  19. 'Application_Model_DbTable_Trainings',
  20. 'Application_Model_DbTable_TrainingInstanceUser'
  21. );
  22.  
  23. }
  24.  
  25.  
  26. //pojedynczy rekord z tabeli trainings class Application_Model_DbTable_Trainings_Row extends Zend_Db_Table_Row
  27. //metoda pobiera liste training_instance skojarzonych z danym rekordem trainings na rzecz, kto//pojedynczy rekord z tabeli users class Application_Model_DbTable_Users_Row extends Zend_Db_Table_Rowgo wywoływana jest metoda
  28. public function getInstance() {
  29. return $this->findDependentRowset('Application_Model_DbTable_TrainingInstance');
  30. }
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
amii
post
Post #2





Grupa: Zarejestrowani
Postów: 728
Pomógł: 76
Dołączył: 12.06.2009

Ostrzeżenie: (0%)
-----


W takiej formie, zwraca mi zero rekordów. Robiłem rzutowanie obiektu $this-user jak i $this-user-getCourses().

W wersji z dwoma joinami obiekt:$this-user zwraca tablicę z 55 rekordami czyli ok bo pobieramy jednego usera.
Natomiast obiekt $this-user->getCourses() zwraca pustą tablicę i to jest problem.

W wersji z jednym join obiekt $this-user->getCourses() zwraca tablicę z dwoma danymi i to jest ok.
Natomiast obiekt $this-user zwraca tablicę z 36 danymi i to też jest ok.

  1. $user_model = new Application_Model_DbTable_Users();
  2. $s = $user_model->select(Zend_Db_Table_Abstract::SELECT_WITH_FROM_PART);
  3. $s->setIntegrityCheck(false);
  4. $s->from(array('u' => 'users'), array('id'))
  5. ->join(array('tui' => 'training_instance_user'), 'u.id=tui.id_user')
  6. ->join(array('tr_in' => 'training_instance'), 'tui.id_training_instance=tr_in.id_training') //jesli wytne tego joina jest ok
  7. ->where('u.id = ?', $this->view->login->id)
  8. ->where('tui.status = ?', 1)
  9. ->where('tui.canceled = ?', 0)
  10. ->where('tr_in.date_start <= NOW()'); //wycinam takze warunek dla join
  11. ;
  12. //przekazujemy dane zalogowanego usera do widoku
  13. $this->view->user = $user_model->fetchRow($s);


W phpmyadmin jeśli wykonam takie zapytanie dostaje 44 rekordy

  1. SELECT users . * , training_instance_user . * , training_instance . *
  2. FROM users
  3. JOIN training_instance_user ON users.id = training_instance_user.id_user
  4. JOIN training_instance ON training_instance_user.id_training_instance = training_instance.id_training
  5. WHERE users.id =106
  6. AND training_instance_user.STATUS =1
  7. AND training_instance_user.canceled =0
  8. AND training_instance.date_start <= NOW( )


Ten post edytował amii 21.08.2012, 10:05:36
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 14.10.2025 - 22:19