Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> MVC - pierwsze kroki i problem z model
yacoos
post 22.06.2007, 12:50:12
Post #1





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 19.02.2005

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


Witam,

Walczę z projektem pierwszy raz używając mvc.
Dużo udało mi się już zwalczyć, ale teraz mam problem próbuję zrobić coś w stylu dwóch zależnych od siebie zapytań do sqla. Problem w tym, że kiedy ustawiam model na to drugie - to już wychodzi mi z pierwszego.
Z resztą.. oto cały kod:


  1. <?php
  2. $this->model->listRozKol($id);
  3. $kolumny[]=array("kolumna"=>'Rozmiary:');
  4. while ( $rozmiar=$this->model->getProduct() ) {
  5. $kolumny[]=$rozmiar;
  6. }
  7.  
  8. $rozmiary[]=$kolumny;
  9. $kolumny=array();
  10. $this->model->listRozWiersz1($id);
  11. while ( $wiersz1=$this->model->getProduct() ) { $i++;
  12. $kolumny[]=array("kolumna"=>$wiersz1["rozmiar_wiersz"]);
  13. $this->model->listRozWiersz2($id, $wiersz1["id_rozmiarw"]);
  14. while ( $wiersz2=$this->model->getProduct2() ) {
  15. $kolumny[]=$wiersz2;
  16. }
  17. $rozmiary[]=$kolumny;
  18. }
  19. ?>


Niestety zawsze widać tylko 1 rekord.. mimo że $this->model->listRozWiersz2($id, $wiersz1["id_rozmiarw"]); powinno wyświetlać ich więcej.

Przypuszczam, że trzeba zakombinować coś w klasie model.. ale sam na chwile obecną chyba sobie z tym nie poradzę - dlatego proszę o podpowiedź.

Przy okazji - są jakieś alternatywy dla MVC? Bo na dłuższą metę to nie wiem czy się z nim dogadam - szczególnie ciężko mi się przyzwyczaić do tych zapytań w Modelu..

Pozdrawiam i jeszcze raz bardzo proszę o podpowiedź.
Jacek
Go to the top of the page
+Quote Post
LBO
post 22.06.2007, 13:16:48
Post #2





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


Daj jakiś bardziej reprezentatywny kod, bo ciężko coś wywnioskować z tego co wkleiłeś.

  1. <?php
  2. while ( $wiersz1=$this->model->getProduct() ) { $i++;
  3. ?>


Po co to $i++?

Po za tym 2 razy zapełniasz tablicę $rozmiary, a na pewno nie używasz jej za pierwszym razem.

edit:
Cytat
Przy okazji - są jakieś alternatywy dla MVC?


Owszem, są. Poczytaj o frameworku PRADO i jaka jest jego zasada działania.

Ten post edytował LBO 22.06.2007, 13:18:34
Go to the top of the page
+Quote Post
yacoos
post 22.06.2007, 13:24:01
Post #3





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 19.02.2005

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


Witam,
Dzięki za reakcję.. Za pomocą tego $i sprawdzałem ile razy kręci się ta pętla.

W tym momencie:
$this->model->listRozWiersz1($id);
Wywołuję funkcję:

function listRozWiersz1($id) {
$this->dao->fetch("SELECT ...... ;");
}

Liczba rekordów w tym zapytaniu jest > 1 natomiast ten while:
while ( $wiersz1=$this->model->getProduct() ) { ....
przekręca się tylko raz.

Wydaje mi się że przyczną tego jest ustawienie w nim: $this->model->listRozWiersz2($id, $wiersz1["id_rozmiarw"]);
ponieważ listRozWiersz2 to znowu $this->dao->fetch("SELECT ...... ;"); ...

Nie rozumiem dlaczego pętla obraca się raz skoro rekordów wynikających z zapytania jest więcej..
Co jeszcze wkleić?

Pozdrawiam,
Jacek
Go to the top of the page
+Quote Post
LBO
post 22.06.2007, 13:42:37
Post #4





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


Sorry, ale coraz mniej z Tego rozumiem.

Nie powiem Ci dokładnie co jest nie tak - przyczyną są dwa główne problemy, piszesz tak jakbym znał Twoja implementację i używasz najgorszego możliwego nazewnictwa: zróbTo1(), zróbTo2() etc.

Na pewno wiem, że coś nie tak w samym modelu jest - źle agreguje wyniki zapytania.

Ten post edytował LBO 22.06.2007, 13:45:00
Go to the top of the page
+Quote Post
yacoos
post 22.06.2007, 13:58:05
Post #5





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 19.02.2005

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


OK, teraz postaram się kompleksowo:
Jeżeli zrobię tak (pominę drugie zapytanie):
  1. <?php
  2. $kolumny=array();
  3. $this->model->listRozWiersz1($id);
  4. while ( $wiersz1=$this->model->getProduct() ) { $i++;
  5. $kolumny[]=array("kolumna"=>$wiersz1["rozmiar_wiersz"]);
  6. #$this->model->listRozWiersz2($id, $wiersz1["id_rozmiarw"]);
  7. #while ( $wiersz2=$this->model->getProduct2() ) {
  8. #$kolumny[]=$wiersz2;
  9. #}
  10.  
  11. $rozmiary[]=$kolumny;
  12. $kolumny=array();
  13. }
  14. ?>

To wtedy {$rozmiary} Array (2) . Czyli jest OK.
Natomiast Kiedy odhaszuje drugie wywołanie modelu i while:
  1. <?php
  2. $kolumny=array();
  3. $this->model->listRozWiersz1($id);
  4. while ( $wiersz1=$this->model->getProduct() ) { $i++;
  5. $kolumny[]=array("kolumna"=>$wiersz1["rozmiar_wiersz"]);
  6. $this->model->listRozWiersz2($id, $wiersz1["id_rozmiarw"]);
  7. while ( $wiersz2=$this->model->getProduct2() ) {
  8. $kolumny[]=$wiersz2;
  9. }
  10.  
  11. $rozmiary[]=$kolumny;
  12. $kolumny=array();
  13. }
  14. ?>


I teraz już: {$rozmiary} Array (1)

Funkcje z klasy Model:
  1. <?php
  2. function listRozWiersz1($id) {
  3. $this->dao->fetch("SELECT DISTINCT rozmiar_wartosc.id_rozmiarw, rozmiar_wiersz.rozmiar_wiersz FROM `rozmiar_wartosc` LEFT JOIN rozmiar_wiersz ON (rozmiar_wiersz.id_rozmiarw=rozmiar_wartosc.id_rozmiarw) WHERE id_produkt = '".$id."';");
  4. }
  5.  
  6. function listRozWiersz2($id, $idwiersz) {
  7. $this->dao->fetch("SELECT DISTINCT rozmiar_wartosc.wartosc AS kolumna FROM `rozmiar_wartosc` ,
     `rozmiar_kolumna` WHERE id_produkt = '"
    .$id."' AND rozmiar_wartosc.id_rozmiark = rozmiar_kolumna.id_rozmiark AND rozmiar_warto
    sc.id_rozmiarw='"
    .$idwiersz."' ORDER BY rozmiar_kolumna.rozmiar_liczba;");
  8. }
  9.  
  10.  function getProduct() {
  11. if ( $product=$this->dao->getRow() )
  12. return $product;
  13. else
  14. return false;
  15. }
  16.  
  17. function getProduct2() {
  18. if ( $product=$this->dao->getRow() )
  19. return $product;
  20. else
  21. return false;
  22. }
  23. ?>


W klasie Connect (obiekt dao) mam:
  1. <?php
  2. function fetch($sql) {
  3. $this->query=mysql_unbuffered_query($sql,$this->db) or die(mysql_error()); // Perform query here
  4. }
  5.  
  6.  function getRow () {
  7. if ( $row=mysql_fetch_array($this->query,MYSQL_ASSOC) )
  8. return $row;
  9. else
  10. return false;
  11. }
  12. ?>


Teraz jaśniej?
Nie wiem nawet co jeszcze mógłbym powklejać..
Pozdrawiam,
Jacek
Go to the top of the page
+Quote Post
LBO
post 22.06.2007, 14:11:03
Post #6





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


No i wszystko jasne. To wina sposobu w jakim pracujesz na $dao.
Pobierasz dane metodą
  1. <?php
  2. listRozWiersz1()
  3. ?>

a do przechodzenia po kolejnych rekordach
  1. <?php
  2. getProduct1()
  3. ?>

i wszystko super, tylko, że metody
  1. <?php
  2. listRozWiersz2()
  3. ?>

i
  1. <?php
  2. getProduct2()
  3. ?>

Robia to samo na tej samej instancji $dao.

Innymi słowy przechodząc po $dao w pierwszej pętli - zawierającego rekordy z listRozWiersz1() - modyfikujesz go, tak, że zawiera całkiem inny zestaw rekordów (pobranych w listRozWiersz2()).
Go to the top of the page
+Quote Post
yacoos
post 22.06.2007, 14:24:12
Post #7





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 19.02.2005

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


OK, tego się spodziewałem że coś sobie gdzieś nadpisuję - a mogę prosić jakąś podpowiedź jak temu zapobiec?
Go to the top of the page
+Quote Post
LBO
post 22.06.2007, 14:39:47
Post #8





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


Najlepiej - moim daniem - stworzyć klasę specjalnie do trzymania rekordów. Klasa taka (Rowset) była by wracana jako wynik np. listRozWiersz1(). Jakbyś odpowiednio zbudował, to mógłbyś osiągnąć taki efekt:

  1. <?php
  2. $rozmiary = $this->model->listRozWiersz1($id);
  3. foreach ($rozmiary as $wiersz) {
  4. // Wypisujesz rekordy z zapytania w metodzie listRozWiersz1().
  5. print $wiersz['id_rozmiarw'] . ",t" . $wiersz['rozmiar_wiersz'] . "n";
  6. }
  7. ?>


Bardzo ładnie pod tym względem prezentuje się komponent Zend_Db_Table z Zend Framework'a.

Ten post edytował LBO 22.06.2007, 14:40:35
Go to the top of the page
+Quote Post
yacoos
post 22.06.2007, 15:41:22
Post #9





Grupa: Zarejestrowani
Postów: 27
Pomógł: 0
Dołączył: 19.02.2005

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


Niestety nowa klasa to jak dla mnie za dużo na raz smile.gif
Dorobiłem sobie do klasy z której jest $dao takie coś:
  1. <?php
  2. function assoc($sql) {
  3. $this->query = mysql_query($sql);
  4. while ($rek=mysql_fetch_assoc($this->query)) {
  5. $return[]=$rek;
  6. }
  7. return $return;
  8. }
  9. ?>


No i później już:
  1. <?php
  2. $naglowki = $this->model->dao->assoc("SELECT DISTINCT CONCAT(rozmiar_kolumna.rozmiar_kolumna,'(',rozmiar_liczba,')') AS kolumna FROM `rozmiar_kolumna` LEFT JOIN rozmiar_wartosc ON (rozmiar_wartosc.id_rozmiark=rozmiar_kolumna.id_rozmiark) WHERE rozmiar_wartosc.id_produkt='".$id."' ORDER BY rozmiar_kolumna.rozmiar_liczba;");
  3. $kolumny[]='Rozmiary:';
  4. foreach ($naglowki as $naglowek) { 
  5. $kolumny[]=$naglowek["kolumna"];
  6. }
  7. ?>

Wiem że to pewnie nie bardzo obiektowe i w ogóle do.... smile.gif ale działa smile.gif
A co do PRADO - wolałbym coś mniej 'automatycznego' - tak żebym mógł sobie dalej używać QuickForm'a i Smarty - chodzi mi tylko o jakiś sprytny przykład poskładania tego wszystkiego w klasy.
Pozdrawiam i bardzo dziękuję za podpowiedzi,
Jacek
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 26.06.2025 - 01:06