[zend] wyswietlanie polaczonych danych z dwoch tabell |
[zend] wyswietlanie polaczonych danych z dwoch tabell |
23.10.2008, 18:22:39
Post
#1
|
|
Grupa: Zarejestrowani Postów: 405 Pomógł: 6 Dołączył: 12.01.2007 Ostrzeżenie: (0%) |
Odnośnie tego co pisał batman i thm w innym moim poście chciałbym zrobić teraz poprawne pod względem technicznym wyświetlanie połączonych danych z dwóch tabel.
Powiem co zrobiłem: W folderze 'models' utworzyłem pliki: Ksiazki.php: Kod <?php class Ksiazki extends Zend_Db_Table { protected $_name = 'ksiazki'; protected $_primary = 'id_ksiazki'; } Autorzy.php: Kod <?php class Autorzy extends Zend_Db_Table { protected $_name = 'autorzy'; protected $_primary = 'id_autora'; } Natomiast w pliku IndexController.php mam: Kod public function indexAction() { $db = Zend_Registry::get('dbAdapter'); $select = $db->select() ->from(array('k' => 'ksiazki')) ->join(array('a' => 'autorzy'), 'k.id_autora = a.id_autora'); $this->view->lista = $db->fetchAll($select); } A w innym pliku wyświetlam wyniki zapytania. Wszystko działa, ale jak widzicie w pliku 'IndexController.php' nie robię chyba zbyt poprawnym sposobem przynajmniej takie odniosłem wrażenie po wypowiedzi batmana i thm?? Więc jak to powinno wyglądać prawidłowo ? Jak rozumiem powinno być w pliku IndexController.php coś takiego: Kod public function indexAction() { $ksiazkiTabela = new Ksiazki(); $autorzyTabela = new Autorzy(); } Ale co dalej - jak zrobić SELECTA ? Bo jak zrobię tak jak na tej stronie: http://framework.zend.com/manual/en/zend.d...t.building.join // Create the Zend_Db_Select object $select = $db->select(); to wrócę przecież do tego sposobu wyświetlania, który mam obecnie, a który nie jest podobno poprawny. Ten post edytował nieraczek 23.10.2008, 18:25:41 |
|
|
23.10.2008, 21:14:36
Post
#2
|
|
Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 |
Jak to powinno wyglądać u Ciebie.
1. W kontrolerze tworzysz obiekt modelu Książki 2. W modelu Książki dodajesz metodę getBooksWithAuthors. 3. W nowej metodzie wykonujesz zapytanie i zwracasz wyniki.
-------------------- I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features. |
|
|
24.10.2008, 06:53:14
Post
#3
|
|
Grupa: Zarejestrowani Postów: 405 Pomógł: 6 Dołączył: 12.01.2007 Ostrzeżenie: (0%) |
W modelu Ksiazki zrobiłem tak:
Kod public function getBooksWithAuthors() { $this->select() ->from(array('k' => 'ksiazki')) ->join(array('a' => 'autorzy'), 'k.id_autora = a.id_autora'); return $this->fetchAll($select); } W kontrolerze tak: Kod $ksiazkiTabela = new KsiazkiTable(); $this->view->lista = $ksiazkiTabela->getBooksWithAuthors(); Jednak Kod var_dump($this->lista); zwraca mi NULL. W tej funkcji getBooksWithAuthors() chyba coś nie tak z zapytaniem ?A może jednak to niemożliwe żeby w modelu, który odpowiada za tabelę Ksiazki pobrać takze dane z tabeli Autorzy ? Bo na tej stronie jest opisana metoda taką jak robiłem poprzednio i określona mianem 'najlepszej praktyki': http://wiki.ekini.net/main/Zend_db Kod Best Practices [edit] What is the best way to do queries in Zend Framework? Please see this blog post http://blog.ekini.net/2008/02/12/what-is-the-safest-way-to-do-database-queries-in-zend-framework/ //Roman Nestertsov's way of doing it. $db = Zend_Registry::get(’dbAdapter’); $sql = $db->quoteInto(”SELECT * FROM Table1 WHERE id = ?”, $target_id); //Erik's way of doing it. $db = Zend_Registry::get(’dbAdapter’); $select = $db->select()-> from(’Table1′, ‘*’)-> where(’id = ?’, $id)-> where(’url = ?’, $url); $row = $db->fetchRow($select); Czyli tak jak robiłem poprzednio. Ale z drugiej strony wtedy nie potrzebne byłyby modele, czyli jednak jakoś powinno się to dać zrobić w klasie, tylko jak ? |
|
|
24.10.2008, 06:58:32
Post
#4
|
|
Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 |
Cytat W modelu Ksiazki zrobiłem tak: Zwraca Ci NULL ponieważ do fetchAll przekazujesz zmienną, która nie zawiera zapytania. Dziwne, że nie zgłosiło Ci błędu lub ostrzeżenia. Zrób tak:
Jeśli nadal będzie zwracało NULL, to przed return wstaw echo $select i zobacz co Ci za SQL-a skleiło. -------------------- I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features. |
|
|
24.10.2008, 07:12:12
Post
#5
|
|
Grupa: Zarejestrowani Postów: 405 Pomógł: 6 Dołączył: 12.01.2007 Ostrzeżenie: (0%) |
Jak zamiast aliasu 'k' użyję całej nazwy tabeli to też jest ten sam błąd: Kod public function getBooksWithAuthors() { $select = $this->select() ->join(array('a' => 'autorzy'), 'ksiazki.id_autora = a.id_autora'); return $this->fetchAll($select); } Może faktycznie nie można w klasie odpowiedzialnej za tabelę używać zapytania z JOIN'em. Tylko wówczas oznaczałoby to poważne ograniczenie w modelach ZF i to, że nadają się one tylko do zwracania wyników zapytania tej tabeli której dotyczy dany model hm...... |
|
|
24.10.2008, 07:18:40
Post
#6
|
|
Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 |
Sądziłem, że ten sposób zadziała. Skoro nie działa, to zadziała ten
-------------------- I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features. |
|
|
24.10.2008, 08:09:39
Post
#7
|
|
Grupa: Zarejestrowani Postów: 405 Pomógł: 6 Dołączył: 12.01.2007 Ostrzeżenie: (0%) |
hm.......
Obojętnie czy mam:
czy
czy
to i tak dostaję komunikat: Kod An error occurred
Application error Exception information: Message: SQLSTATE[42000]: Syntax error or access violation: 1064 Something is wrong in your syntax obok '' w linii 1 |
|
|
24.10.2008, 08:27:19
Post
#8
|
|
Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 |
Zrób echo ze zmiennej $select i wykonaj je w pgadminie/phpmyadminie. Nie możliwe, by to nie działało.
-------------------- I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features. |
|
|
24.10.2008, 08:49:52
Post
#9
|
|
Grupa: Zarejestrowani Postów: 405 Pomógł: 6 Dołączył: 12.01.2007 Ostrzeżenie: (0%) |
Dziwne, bo jeden sposób nie działa, a drugi który opisałem niżej działa
Więc w modelu mam:
W kontrolerze:
echo selecta dało wynik: Kod SELECT `k`.*, `a`.* FROM `ksiazki` AS `k` INNER JOIN `autorzy` AS `a` ON k.id_autora = a.id_autora Ale jak w modelu zrobię tak:
A w kontrolerze tak:
To wszystko działa i poprawnie się wyświetla, jednak nie rozumiem czemu tamten sposób nie działa, nawet jak w tamtym sposobie tak jak tu zwrócę $select i w kontrolerze tak jak tu zrobię fetchAll() to i tak nie działa, ta funkcja select() ZF ma jakieś błędy czy co ? Ten post edytował nieraczek 24.10.2008, 08:54:41 |
|
|
24.10.2008, 08:53:05
Post
#10
|
|
Grupa: Zarejestrowani Postów: 740 Pomógł: 15 Dołączył: 23.08.2004 Skąd: Poznań Ostrzeżenie: (0%) |
Bo za pierwszym razem próbujesz wykonać
Kod $this->fetchAll($select); a za drugim wykonujesz Kod $select->fetchAll();
-------------------- bigZbig (Zbigniew Heintze) | blog.heintze.pl
|
|
|
24.10.2008, 08:55:09
Post
#11
|
|
Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 |
Masz jakieś dziwne problemy. U mnie działa to bez żadnych cyrków
Możliwe, że jest jakiś błąd w ZF, możliwe jest też to, że z powodu błędu w kodowaniu danych wysyłanych do bazy i samej bazy. Powodów może być wiele. edit @bigZbig To nie ma znaczenia, w takim sensie jak Ty to podajesz. Jednak Twój post nakierował mnie na problem. Wstaw do modelu i będzie działać. Nie zauważyłem, że robisz fetchAll na obiekcie modelu, a nie na adapterze.
-------------------- I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features. |
|
|
24.10.2008, 09:05:49
Post
#12
|
|
Grupa: Zarejestrowani Postów: 405 Pomógł: 6 Dołączył: 12.01.2007 Ostrzeżenie: (0%) |
lol - faktycznie, zrobiłem tak jak napisał batman i teraz działa - dzięki batman i bigZbig - dam Wam obu 'pomogl'
Ten post edytował nieraczek 24.10.2008, 09:06:13 |
|
|
10.11.2008, 17:03:25
Post
#13
|
|
Grupa: Zarejestrowani Postów: 4 Pomógł: 0 Dołączył: 7.04.2008 Ostrzeżenie: (0%) |
Witam mam problem...wzorowałem się na tym wątku i w modelu mam
a w kontrolerze akcje details
i nic pusto... zwraca pustą tablice... zapytanie generowane przez model działa w phpmyadmin. Zrobiłem jakiś oczywisty błąd?? Poprzednie sposoby także zwracają mi pustą tablice.... |
|
|
10.11.2008, 18:19:28
Post
#14
|
|
Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 |
Zamiast
powinno być . Ale to nie powinno być przyczyną problemów. Wstaw przed return . Wówczas wykonaj zapytanie, które się wyświetli w phpmyadmin/pgadmin i zobacz czy też zwróci pusty wynik. -------------------- I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features. |
|
|
10.11.2008, 19:18:32
Post
#15
|
|
Grupa: Zarejestrowani Postów: 4 Pomógł: 0 Dołączył: 7.04.2008 Ostrzeżenie: (0%) |
już to robiłem... zapytanie jest dobre.
|
|
|
10.11.2008, 20:05:10
Post
#16
|
|
Grupa: Moderatorzy Postów: 2 921 Pomógł: 269 Dołączył: 11.08.2005 Skąd: 127.0.0.1 |
Cytat zapytanie jest dobre Czyli zwróciło jakieś wiersze? Jeśli tak, to
i zobacz co się wyświetli. -------------------- I would love to change the world, but they won't give me the source code.
My software never has bugs. It just develops random features. |
|
|
11.11.2008, 14:02:25
Post
#17
|
|
Grupa: Zarejestrowani Postów: 4 Pomógł: 0 Dołączył: 7.04.2008 Ostrzeżenie: (0%) |
Dzieki. kurcze zwraca...
Mam podpięte SMARTY, może w tym jest problem i muszę wyświetlać to innym sposobem niż do tej pory zwykłe $model->fetchAll(). Namieszałem ze smartym dlatego nie wyświetlało. Dzięki za pomoc!! |
|
|
Wersja Lo-Fi | Aktualny czas: 28.04.2024 - 11:40 |