Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework] Własne zapytanie
Forum PHP.pl > Forum > PHP > Frameworki
in5ane
Hi, dopiero co niedawno zacząłem naukę Zend Frameworka i chciałbym utworzyć własne zapytanie.

Standardowo stworzyłem tak (oczywiście to tylko kawałki kodu):
index.php
  1. <?php
  2. $db = Zend_Db::factory($config->db->adapter, $config->db->config->toArray());
  3. Zend_Db_Table::setDefaultAdapter($db);
  4. ?>


IndexController.php
  1. <?php
  2. function announcementsAction() {
  3.        $this->view->title = "Ogłoszenia";
  4.        
  5.        $announcements = new announcements();
  6.        $this->view->row_announcements = $announcements->fetchAll();
  7.    }
  8. ?>


Announcements.php (model)
  1. <?php
  2. class Announcements extends Zend_Db_Table {
  3.    protected $_name = 'announcements';
  4. }
  5. ?>


announcements.phtml (wyświetlanie)
  1. <?php foreach($this->row_announcements as $row) : ?>
  2.        <!-- jakieś tam wyświetlanie w htmlu -->
  3. <?php endforeach; ?>


I moje pytanie brzmi, jak mam utworzyć sobie własne zapytanie? Tzn. chciałbym np. dodać klauzule ORDER BY oraz LIMIT.

Z góry dziękuję za odpowiedź.


P.S.: Oczywiście mowa o mysql.
sowiq
Cytat(in5ane @ 21.06.2009, 00:57:37 ) *
chciałbym np. dodać klauzule ORDER BY oraz LIMIT.
Wszystko ładnie opisane w dokumentacji, np. Example 15.98. Example of finding rows by an expression:
Kod
$select = $table->select()->where(array('bug_status = ?' => 'NEW'))
                          ->order($order)
                          ->limit($count, $offset);
viking
A jeśli potrzebujesz niestandardowe zapytanie możesz się "cofnąć" przez $table->getAdapter()->[polecenia np. query()] (chyba tak, piszę z pamięci). Może się również przydać przy transakcjach.
in5ane
@sowiq: znalazłem to i czytałem, no ale nie wiem jak za bardzo mam to użyć. Gdzie mam wstawić to zapytanie i zamiast czego. Dopiero się uczę Zenda i jest nie wiem wszystkiego.

Próbowałem w IndexController.php tak:
  1. <?php
  2. $announcements = new announcements();
  3.        $order = 'content';
  4.        $select = $announcements->select()->order($order);
  5.        $row_announcements = $table->fetchAll($select);
  6. ?>

Ale to jest coś źle.

Error:
Kod
Notice: Undefined variable: table in D:\wamp\www\application\controllers\IndexController.php on line 45

Fatal error: Call to a member function fetchAll() on a non-object in D:\wamp\www\application\controllers\IndexController.php on line 45
destroyerr
A Ty czasem nie zasnąłeś nad przy tym kodzie i błędzie. Treść błędu, a także wcześniejszego zawiadomienia, jasno mówi czego w Twoim kodzie brakuje, a dokładniej, czego nie zmieniłeś przy przepisywaniu. Przeczytaj łaskawie błąd i wtedy będziesz wiedział co zrobiłeś nie tak.
in5ane
Już wiem o co chodzi, nic nie wpisałem w select. Zaraz pokombinuję...

@edit: nie mogę w tej dokumentacji znaleźć jak to powinno wyglądać, wiem (chyba), że za pomocą Zend_Db_Table trzeba się odwołać do jakiejś klasy (albo od razu do tabeli).
destroyerr
Nie! Zwróć uwagę na to: Undefined variable: table
in5ane
Wiem jaki błąd, dopisałem: ->from($this->_name) ale to nic nie daje ;/
phpion
Cytat(destroyerr @ 21.06.2009, 10:28:23 ) *
Nie! Zwróć uwagę na to: Undefined variable: table

exclamation.gif czyżby tam powinno być $announcements* zamiast $table questionmark.gif

* lub $select - nie znam ZF
destroyerr
@phpion: ja też nie znam, ale z dokumentacji wynika, że $announcements. Tutaj jest odpowiedni rozdział: http://framework.zend.com/manual/en/zend.d...table.fetch-all

@in5ane do Ciebie chyba nie warto pisać.

Nie będę nabijać postów bo to niewskazane i niemoralne, więc edytuję i mam pytanie do Ciebie, dlaczego autor nie znając frameworka się za niego zabiera? Poza tym możesz mi pokazać czego nie w dokumentacji o co pytał autor? Wszystko jest, zajrzałem do niej i już wiedziałem. Natomiast wytłumacz mi jaki związek miał drugi błąd z ZF?
batman
~in5ane
Jest o tym i w dokumentacji i w kodzie. Wystarczyłoby posiedzieć nad problemem 5 minut.
  1. <?php
  2. /**
  3.      * Fetches all rows.
  4.      *
  5.      * Honors the Zend_Db_Adapter fetch mode.
  6.      *
  7.      * @param string|array|Zend_Db_Table_Select $where  OPTIONAL An SQL WHERE clause or Zend_Db_Table_Select object.
  8.      * @param string|array                      $order  OPTIONAL An SQL ORDER clause.
  9.      * @param int                               $count  OPTIONAL An SQL LIMIT count.
  10.      * @param int                               $offset OPTIONAL An SQL LIMIT offset.
  11.      * @return Zend_Db_Table_Rowset_Abstract The row results per the Zend_Db_Adapter fetch mode.
  12.      */
  13.    public function fetchAll($where = null, $order = null, $count = null, $offset = null)
  14. ?>


~phpion, ~destroyerr
Skoro nie znacie tego frameworka, to po jaką cholerę się udzielacie? A jeśli padnie pytanie o literaturę angielską okresu elżbietańskiego, to też będziecie nabijać posty?
viking
A co za różnica czy znają czy nie jak problemem jest to że in5ane nie potrafi zrozumieć błędu którym mu php rzuca? A jak widzisz nie ma tu nigdzie Zend_cośtam_Exception. Do tego w dokumentacji ZF akurat wszystko jest pięknie napisane. Tu potrzebny jest jakiś kurs dla początkujących dot. programowania obiektowego czy może w ogóle PHP.
batman
A wiesz dlaczego pojawił się ten błąd? Ponieważ osoba, która nie zna ZF, źle podpowiedziała. A ZF ma to do siebie, że jak czasem rzuci błędem, to za Chiny nie wiesz, w którym miejscu popełniłeś błąd.
Jeśli nie wie się nic na dany temat, to lepiej siedzieć cicho, niż zrobić z siebie idiotę.
viking
ZF rzuca zwykłymi wyjątkami (lub czasami noticem np w Zend_Translate ale w 99% przypadków można to zmienić) i to od programisty zależy jak je sobie obsłuży. Jeśli nie obejmujesz kodu try ..catch albo co gorsze display_errors na off to może i jest nieczytelne. Ale jeśli już bardziej się postarasz i wykorzystasz metody $exception->getMessage/File a zwłaszcza getTrace() i sobie coś z tym sensownie zrobisz to nie wiem dlaczego miałbyś się za Chiny nie połapać. Oczywiście mogą zdarzyć się przypadki błędu (choćby literówka w Zend_Cache: backend=>frontened, zmienione w 1.8.3) ale te są w miarę szybko wyłapywane i poprawiane. in5ane dostał dobrą odpowiedź tylko jego problemem jest bezmyślne kopiowanie bez spojrzenia w dokumentację i nieumiejętność czytania błędów (bo niby jak chce się dobrać do metody nieistniejącego obiektu?).

A do in5ane: ściągnij sobie edytor który oferuje w miarę sensowne podpowiadanie składni (np. netbeans) i na drugi raz pisz z palca jeśli z czymś dopiero zaczynasz. Powinieneś więcej w ten sposób zrozumieć. Do tego NB podkreśla nieużywane zmienne.
batman
Cytat
in5ane dostał dobrą odpowiedź
Wybacz, ale nie mogę się z Tobą zgodzić. Odpowiedź jaką dostał, została po chamsku wycięta z manuala, bez chwili zastanowienia, mimo, że poprawna odpowiedź była kilka wierszy dalej.
Pomijam fakt, że znalezienie odpowiedzi na to pytanie nie było jakoś wybitnie trudne, co napisałem w moim poprzednim poście.
A jeśli twierdzisz, że wszystkie błedy w ZF są jasne jak słupek uranu, oznacza, że nie znasz ZF na tyle, by takich błędów się dorobić. To, że pojawił się wyjątek, nie znaczy, że przyczyna błędu jest oczywista.

Proszę pisać na temat, ponieważ nabijanie postów nie należy do pochwalanych praktyk na tym forum.

EOT.
in5ane
Ogólnie dziękuję za zainteresowanie. Co do destroyerr oraz viking, jeżeli nie wiecie o co chodzi to nie piszcie (to raz), i dla waszej wiadomości kombinowałem i siedziałem w dokumentacji (nie długo, bo musiałem wyjść, ale siedziałem) i nie znalazłem z początku (to dwa).

Pozdrawiam, dzięki batman.
sowiq
Cytat(batman @ 21.06.2009, 13:09:27 ) *
Odpowiedź jaką dostał, została po chamsku wycięta z manuala, bez chwili zastanowienia, mimo, że poprawna odpowiedź była kilka wierszy dalej.
Ja też uczę się dopiero Zend, ale zauważ, że nie napisałem na forum ani jednego tematu traktującego o tym FW. A dlaczego? Bo takie proste rzeczy potrafię znaleźć w manualu (który jest zresztą bardzo dobry). Po to podałem linka autorowi, żeby wszedł i przeczytał. A wstawiony przeze mnie kod był tylko przykładem jak prosto rozwiązuje się przedstawiony przez autora problem. To nie moja wina, że skopiował sobie bezmyślnie kod ze zmienną, która w jego skrypcie nie istnieje. Sorry, ale myślenia, podstaw programowania i rozumienia komunikatów parsera to ja nikogo uczył nie będę.

Cytat(batman @ 21.06.2009, 13:09:27 ) *
Pomijam fakt, że znalezienie odpowiedzi na to pytanie nie było jakoś wybitnie trudne, co napisałem w moim poprzednim poście.
Właśnie dlatego umieściłem linka, a nie gotowe rozwiązanie. Cały czas mi się wydawało, że ludzie na forum (a już na pewno użytkownicy ze stażem) nakłaniają do samodzielnego wyszukiwania odpowiedzi na tego typu pytania. Ja na początku też nie wiedziałem jak budować takie zapytania w ZF - wpisałem 2 słowa do Google i wiem.
Zresztą, widzę, że stawanie w obronie zostało Ci wynagrodzone punkcikiem od autora smile.gif
phpion
Cytat(sowiq @ 21.06.2009, 18:14:12 ) *
Zresztą, widzę, że stawanie w obronie zostało Ci wynagrodzone punkcikiem od autora smile.gif

Który, swoją drogą, nie został przypisany do wartościowej wypowiedzi, a co za tym idzie taki "pomógł" jest bezużyteczny i nie daje nic poza punkcik.

PS: jeżeli nie znam tematu to się nie wypowiadam, ale jeżeli wydaje mi się, że w jakimś stopniu mogę pomóc to to robię.
in5ane
To "pomógł" miało być do jego postu wcześniejszego (kliknąłem przy tym poście, bo był akurat najbliżej dołu strony, gdzie się aktualnie znajdowałem). Ale nawiasem, co was to obchodzi... Podziękowałem ogólnie każdemu za zainteresowanie i chyba tyle wystarczy.

P.S.: Ale teraz już zajarzyłem te zapytania i tworzenie ich, teraz będę musiał dodać klauzulę WHERE i już wiem jak to zrobić.


---


Nie chciałem tworzyć nowego tematu, więc piszę tutaj.

Chodzi mi tym razem o to, jak wykorzystać fetchRow zamiast fetchAll. Gdyż potrzebuję wyciągnąć z bazy tylko jeden rekord.
Powiedzmy, że mam:
  1. <?php
  2. $config = new config();
  3. $where = 'name = "news"';
  4. $select = $config->select()->where($where);
  5. $this->view->row_config = $config->fetchAll($select);
  6. ?>


I dane przedstawiam tak:
  1. <?php foreach($this->row_config as $row) : ?>
  2. <?php echo $this->escape($row->description);?>
  3. <?php endforeach; ?>


No i to jest oczywiste, po co tworzyć pętlę i mulić skrypt, jak można użyć tego fetchRow, tylko nie wiem właśnie jak to mogę użyć i później w widoku przedstawić.

Z góry dzięki za rady.


P.S.: Czytałem o tym w dokumentacji, ale tam jest jakoś to dziwnie napisane.
viking
Co jest dziwnie napisane? Zamiast fetchAll użyj fetchRow (which returns an object of type Zend_Db_Table_Row co w prostej linii prowadzi cię do wniosku żeby używać ..row_config->nazwisko, ...row_config->id itp). Poszukaj polskiej dokumentacji może.
in5ane
Dzięki, zrobiłem, a mam pytanie, czy to dużo przyspiesza skrypt jak się użyje zamiast fetchAll to fetchRow?
phpion
Hmmm, ogólnie rzecz biorąc to rozmyślania nt. ZF + wydajność są wg mnie śmieszne. Poczytaj lepiej jakie są problemy z ZF (w szczgólności na maszynach współdzielonych) więc nie sądzę* by fetchAll vs fetchRow przyniosło widoczne korzyści wydajnościowe. Lepiej zajmij się odpowiednią strukturą bazy danych oraz mechanizmem cache, które z pewnością więcej Ci dadzą.

Cytat(in5ane @ 22.06.2009, 01:14:53 ) *
Ale nawiasem, co was to obchodzi...

Ano to, że dałeś "pomógł" postowi, który nijak nie był pomocny (bo akurat miałeś do niego bliżej...). Jeśli w przyszłości ktoś będzie szukał czegoś nt. "własnego zapytania" i trafi na ten wątek, spojrzy na "pomocniczy" post i co? I jajco. Mógłbyś bardziej rozważnie klikać, a nie tylko po to, by się odwdzięczyć.

* ale nie znam ZF więc pewnie nie powinienem się wypowiadać, przepraszam.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.