Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [Symfony] Ilość zwracanych danych po odp bazy, doSelectJoinAll(), doSelectJoinObiekt().....
Ravv
post
Post #1





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 8.02.2006

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


Witam.

Czy normalne jest że ilość zwracanych danych przez obiekt sfOutputEscaperArrayDecorator (po wywołaniu polecenia doSelectJoinAll*()) jest nad wyraz duża?

W sumie wygląda na to że pobierając np. jeden artykuł z tabeli z artykułami (czyli jeden wiersz) z bazy przy pomocy np. doSelectJoinAutor() by np. prócz ID autora dostać też jego Nazwisko (z osobnej tabeli 'Autor') -> Propel zwraca:
1) obiekt 'Artykuł' (ok)
1a) obiekt 'Autor' powiązany z poprzednim obiektem 'Artykuł' (ok)
1b) wszystkie obiekty 'Artykuł' powiązane z pobranym punkt wcześniej obiektem 'Autor' (exclamation.gif!)

Czy idzie jakoś wyeliminować bezużyteczny pkt. 1b)questionmark.gif (oczywiście bezużyteczny gdy pobrane dane chcę tylko wyświetlić)
Bo jeżeli chcę pobrać jeden artykuł i jego autora, to propel zwróci mi tenże artykuł oraz dane autora, a poza tym 1000 obiektów typu 'Artykuł', które należą do tegoż autora....
Poprawnie to rozumiem? Jak tego uniknąć?questionmark.gif

================================================================
Przykład:

Kod PHP:
  1. <?php
  2. public function executeLastNews()
  3.    {
  4.        $c = new Criteria();
  5.        $c->add( ArticlePeer::IS_PUBLISHED, true );
  6.        $c->add( CategoryPeer::IS_PUBLISHED, true );
  7.        $c->addDescendingOrderByColumn( ArticlePeer::CREATED_AT );
  8.        $c->setLimit( $this->items );
  9.        $this->articles = ArticlePeer::doSelectJoinCategory($c);
  10.    }// end executeLastNews();
  11. ?>


Wygenerowane zapytanie przez w/w funkcję doSelectJoinCategory():
  1. SELECT article.ID, article.CATEGORY_ID, article.REGION_ID, article.PICTURE, article.TITLE, article.SHORT_DESC, article.DESC, article.IS_PUBLISHED, article.CREATED_AT, article.UPDATED_AT, category.ID, category.NAME, category.IS_PUBLISHED, category.CREATED_AT FROM `article` LEFT JOIN category ON (article.CATEGORY_ID=category.ID) WHERE article.IS_PUBLISHED=1 AND category.IS_PUBLISHED=1 ORDER BY article.CREATED_AT DESC LIMIT 3


Zwrócone przez bazę wyniki:

  1. ID CATEGORY_ID REGION_ID PICTURE TITLE SHORT_DESC DESC IS_PUBLISHED CREATED_AT UPDATED_AT ID NAME IS_PUBLISHED CREATED_AT
  2. 5 7 20 testowy_drugi.jpg Czy grozi nam powtórka zimy stulecia? Najbliższy tydzień upłynie pod znakiem gwałtownego... TO jest pełny opis.
  3. Najbliższy tydzień upłynie pod... 1 2009-02-04 14:35:59 2009-02-04 14:35:59 7 Teatr 1 2009-02-04 14:35:59


( wiem że ostatnie pole może mało czytelne, ale WSZYSTKO do tej pory jest naprawdę super, tak jak powinno być! )

Tyle że........
podczas var_dump( $articles ) dostaję taki oto obiekt:

  1. <?php
  2. object(sfOutputEscaperArrayDecorator)#65 (3) {
  3.  ["count:private"]=>
  4.  NULL
  5.  ["value:protected"]=>
  6.  array(1) {
  7.    [0]=>
  8.    object(Article)#90 (18) {
  9.      ["id:protected"]=>
  10.      int(5)
  11.      ["category_id:protected"]=>
  12.      int(7)
  13.      ["region_id:protected"]=>
  14.      int(20)
  15.      ["picture:protected"]=>
  16.      string(17) "testowy_drugi.jpg"
  17.      ["title:protected"]=>
  18.      string(38) "Czy grozi nam powtórka zimy stulecia?"
  19.      ["short_desc:protected"]=>
  20.      string(201) "Najbliższy tydzień upłynie pod znakiem gwałtownego ochłodzenia.
  21. Temperatury spadną nawet poniżej -25 stopni. Czy grozi nam powtórka
  22. z zimy stulecia? Wtedy też nic nie zapowiadało fali zimna.
  23. "
  24.      ["desc:protected"]=>
  25.      string(1227) "To jest pełny opis.
  26. Najbliższy tydzień upłynie pod znakiem gwałtownego ochłodzenia.
  27. Temperatury spadną nawet poniżej -25 stopni. Czy grozi nam powtórka
  28. z zimy stulecia? Wtedy też nic nie zapowiadało fali zimna. Itd."
  29.      ["is_published:protected"]=>
  30.      bool(true)
  31.      ["created_at:protected"]=>
  32.      string(19) "2009-02-04 14:35:59"
  33.      ["updated_at:protected"]=>
  34.      string(19) "2009-02-04 14:35:59"
  35.      ["aCategory:protected"]=>
  36.      object(Category)#91 (14) {
  37.        ["id:protected"]=>
  38.        int(7)
  39.        ["name:protected"]=>
  40.        string(5) "Teatr"
  41.        ["is_published:protected"]=>
  42.        bool(true)
  43.        ["created_at:protected"]=>
  44.        string(19) "2009-02-04 14:35:59"
  45.        ["collThemaCategorys:protected"]=>
  46.        NULL
  47.        ["lastThemaCategoryCriteria:private"]=>
  48.        NULL
  49.        ["collArticles:protected"]=>
  50.        array(1) {
  51.          [0]=>
  52.          object(Article)#90 (18) {
  53.            ["id:protected"]=>
  54.            int(5)
  55.            ["category_id:protected"]=>
  56.            int(7)
  57.            ["region_id:protected"]=>
  58.            int(20)
  59.            ["picture:protected"]=>
  60.            string(17) "testowy_drugi.jpg"
  61.            ["title:protected"]=>
  62.            string(38) "Czy grozi nam powtórka zimy stulecia?"
  63.            ["short_desc:protected"]=>
  64.            string(201) "Najbliższy tydzień upłynie pod znakiem gwałtownego ochłodzenia.
  65. Temperatury spadną nawet poniżej -25 stopni. Czy grozi nam powtórka
  66. z zimy stulecia? Wtedy też nic nie zapowiadało fali zimna.
  67. "
  68.            ["desc:protected"]=>
  69.            string(1227) "To jest pełny opis.
  70. Najbliższy tydzień upłynie pod znakiem gwałtownego ochłodzenia.
  71. Temperatury spadną nawet poniżej -25 stopni. Czy grozi nam powtórka
  72. z zimy stulecia? Wtedy też nic nie zapowiadało fali zimna. Itd."
  73.            ["is_published:protected"]=>
  74.            bool(true)
  75.            ["created_at:protected"]=>
  76.            string(19) "2009-02-04 14:35:59"
  77.            ["updated_at:protected"]=>
  78.            string(19) "2009-02-04 14:35:59"
  79.            ["aCategory:protected"]=>
  80.            object(Category)#91 (14) {
  81.              ["id:protected"]=>
  82.              int(7)
  83.              ["name:protected"]=>
  84.              string(5) "Teatr"
  85.              ["is_published:protected"]=>
  86.              bool(true)
  87.              ["created_at:protected"]=>
  88.              string(19) "2009-02-04 14:35:59"
  89.              ["collThemaCategorys:protected"]=>
  90.              NULL
  91.              ["lastThemaCategoryCriteria:private"]=>
  92.              NULL
  93.              ["collArticles:protected"]=>
  94.              array(1) {
  95.                [0]=>
  96.                *RECURSION*
  97.              }
  98.              ["lastArticleCriteria:private"]=>
  99.              NULL
  100.              ["alreadyInSave:protected"]=>
  101.              bool(false)
  102.              ["alreadyInValidation:protected"]=>
  103.              bool(false)
  104.              ["validationFailures:protected"]=>
  105.              array(0) {
  106.              }
  107.              ["_new:private"]=>
  108.              bool(false)
  109.              ["_deleted:private"]=>
  110.              bool(false)
  111.              ["modifiedColumns:protected"]=>
  112.              array(0) {
  113.              }
  114.            }
  115.            ["aRegion:protected"]=>
  116.            NULL
  117.            ["alreadyInSave:protected"]=>
  118.            bool(false)
  119.            ["alreadyInValidation:protected"]=>
  120.            bool(false)
  121.            ["validationFailures:protected"]=>
  122.            array(0) {
  123.            }
  124.            ["_new:private"]=>
  125.            bool(false)
  126.            ["_deleted:private"]=>
  127.            bool(false)
  128.            ["modifiedColumns:protected"]=>
  129.            array(0) {
  130.            }
  131.          }
  132.        }
  133.        ["lastArticleCriteria:private"]=>
  134.        NULL
  135.        ["alreadyInSave:protected"]=>
  136.        bool(false)
  137.        ["alreadyInValidation:protected"]=>
  138.        bool(false)
  139.        ["validationFailures:protected"]=>
  140.        array(0) {
  141.        }
  142.        ["_new:private"]=>
  143.        bool(false)
  144.        ["_deleted:private"]=>
  145.        bool(false)
  146.        ["modifiedColumns:protected"]=>
  147.        array(0) {
  148.        }
  149.      }
  150.      ["aRegion:protected"]=>
  151.      NULL
  152.      ["alreadyInSave:protected"]=>
  153.      bool(false)
  154.      ["alreadyInValidation:protected"]=>
  155.      bool(false)
  156.      ["validationFailures:protected"]=>
  157.      array(0) {
  158.      }
  159.      ["_new:private"]=>
  160.      bool(false)
  161.      ["_deleted:private"]=>
  162.      bool(false)
  163.      ["modifiedColumns:protected"]=>
  164.      array(0) {
  165.      }
  166.    }
  167.  }
  168.  ["escapingMethod:protected"]=>
  169.  string(16) "esc_specialchars"
  170. }
  171. ?>


I to tylko dla jednego rekordu... Jakbym chciał pobrać ich 100, to aż strach pomyśleć jak obciążyłoby to pamięć :/.
Obłęd.

Ten post edytował Ravv 5.02.2009, 21:32:37
Go to the top of the page
+Quote Post
SongoQ
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


Najlepszym rozwiazaniem jest vidok. Dodaje sporego kopa jesli chodzi o wydajnosc wyciagania danaych i wielki spadek zuzycia pamieci.


--------------------
Go to the top of the page
+Quote Post
Ravv
post
Post #3





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 8.02.2006

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


Nie no, jeszcze widoki tworzyć? Tylko po to by móc korzystać z Propela i jednocześnie używać mało zasobów?

Szczerze powiedziawszy - co daje korzystanie z Propela?? Bo jak na razie doczytałem się jednego -> abstrakcyjności jeżeli chodzi o bazy, w tym głownie przytaczany przykład w stylu "jak będziesz chciał zmienić nazwę tabeli/kolumny"...

Ale tak szczerze powiedziawszy -> kto zmienia nazwy tabel / kolumn po zakończeniu tworzenia projektu?!?! może 0,00000000000001% programistów... Po drugie: kto zmienia nawet bazę na inną (np. z MySQL na Postgre)questionmark.gif No, tu może być więcej osób, może z 0,1%.....

Nie widzę jak na razie sensu korzystania z metod Propela. Co prawda pisanie 'zapytań' jest prostsze, ale z doświadczenia wiadomo że te samo zapytanie generujące identyczne wyniki za pomocą Propela a czystego SQLa trwa KILKA RAZY dłużej... Szczęście w nieszczęściu że Propel rusza taką samą liczbę wierszy.

Przykład:
Wynik: 3 wiersze z artykułami połączone z nazwami regionów oraz nazwami kategorii do których należą.

Wygenerowane zapytanie przez PROPEL:
  1. SELECT article.ID, article.CATEGORY_ID, article.REGION_ID, article.PICTURE, article.TITLE, article.SHORT_DESC, article.DESC, article.IS_PUBLISHED, article.CREATED_AT, article.UPDATED_AT, category.ID, category.NAME, category.IS_PUBLISHED, category.CREATED_AT, region.ID, region.NAME FROM `article` CROSS JOIN `thema` LEFT JOIN category ON (article.CATEGORY_ID=category.ID) LEFT JOIN region ON (article.REGION_ID=region.ID) WHERE article.IS_PUBLISHED=1 AND category.IS_PUBLISHED=1 AND thema.IS_PUBLISHED=1 ORDER BY article.CREATED_AT DESC LIMIT 3


Zapytanie moje:
  1. SELECT article.*, category.name AS category_name, region.name AS region_name FROM article, category, thema, thema_category, region WHERE article.is_published=1 AND category.id=article.category_id AND thema_category.category_id=article.category_id AND thema.id=thema_category.thema_id AND category.is_published=1 AND thema.is_published=1 AND article.region_id=region.id ORDER BY article.CREATED_AT DESC LIMIT 3


Wynik identyczny. W pierwszym przypadku Propel rusza o dziwo 2 tabele, w drugim ruszam aż 5, ale ilość ruszonych wierszy w obydwu przypadkach jest taka sama (odpowiednio: 2*3 i 2*1*1*3*1). Ale najciekawsza jest różnica w czasie - zapytanie Propela trwa 0,0027s, moje 0,0006s. [poprawka: czas jest także taki sam ;> - nie dałem w swoim zapytaniu sortowania... teraz już poprawione]

Nie wspomnę już o 2MB różnicy w wykorzystaniu zasobów pamięci serwera... 2MB! - dla 3 zwróconych rekordów!

Wiem że Ameryki nie odkryłem, ale jednak - różnice są ogromne. Dlaczego ludzie korzystają z Propela to wciąż nie wiem. Akurat plus w przenośności systemu moim zdaniem nie rekompensuje różnic w wydajności (użytkownicy odwiedzają stronę codziennie, a system przenosi się raz na parę lat i to może max z 2x)...

PS.
Nie wiem jak z Propelem, ale od kumpla programisty słyszałem że Doctrine potrafi wypluć takie wyniki z bazy, że var_dump() na obiekcie z wynikami powoduje zawieszenie się przeglądarki... ehhh. Po Propelu też się tego bym spodziewał patrząc na przykład z pierwszego posta.

Interesuje mnie na razie jedno: Istnieje możliwość zmuszenia Propela do wyplucia obiektu wynikowego zawierającego TYLKO obiekty stworzone ze zwróconych przez bazę wierszy? (z pominięciem całych odzwierciedlonych tam struktur nikomu nie potrzebnych w normalnym wyświetlaniu wyników) dry.gif

Ten post edytował Ravv 5.02.2009, 15:28:59
Go to the top of the page
+Quote Post
SongoQ
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


Ok, widze ze wiele teorii przed Toba. Co to Propel - szukaj w google ORM przeycztaj kilka art przemysl sprawe zanim zaczniesz pisac glupsta na forum. Nie ma sensu pisac, jest tyle materialow propel to nic nowego. W wiekszosci jezykow istnieje ORM. Co do obiektow ktore wypluwa propel, fakt zgadzam sie ze to troche zajmuje w pamieci. Ale nie sadze ze w Twoim projekcie zawsze chcesz wykorzystywac wszystkie dane z tabeli. Kolejna rzecza to teoria baz danych, nie wiem czy wiesz ale zwracanie wynikow z calej tabeli ( wszystkich pol ) jest wolniejsze od "kilku" pol - nie wierzysz sprawdz, ale to mam nadzieje ze dla Ciebie jest logiczne. Idac dalej jesli robisz zlaczenia do wielu tabel to oczywiste ze kazdy orm bedzie budowal obiekty ze wszystkich danych - a co za tym idzie, zużycie pamięci bedzie wzrastać. Do daje vidok to chyba nie musze tlumaczyc - propel ma mozliwosc zbudowania modelu do odczytu z vidoku. To sa rzeczy tak logiczne i wynikajace same z siebie ze chyba nie trzeba tlumaczyc.


--------------------
Go to the top of the page
+Quote Post
Ravv
post
Post #5





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 8.02.2006

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


No tak, rację masz że ORM stanowi dla mnie (jeszcze?) tajemnicę, mimo to jeżeli var_dump() na wynikach średnio skomplikowanego zapytania (nie mówię tu o systemie bloga, prostej stronki z cms'em, tylko bardziej rozbudowanego systemu / portalu) powoduje zawiechę przeglądarki (lub błędy serwera typu 'Memory Exhausted') to chyba coś z tym nie tak...

PS.
Co do wypisywania głupstw - gdzie Ty głupstwa widzisz? smile.gif. Przecież przytoczyłem tylko znane fakty i zadałem pytanie odnośnie tego czy można wymusić na Propelu zwrot wyników bez tej całej otoczki, bo do tego co chcę zrobić nie jest mi ona potrzebna. Wiem że Artykuł poszerzony o pole z wartością ID autora / kategorii / regionu to już nie obiekt Artukuł, ale może jakoś ominąć?

Pobierając tylko 3 artykuły (bo tyle chcę wyświetlić) z dołączonymi _wartościami_ pól xxx_id będącymi kluczami obcymi do innych tabel - Propel wypluwa takiego giganta, że nawet jakbym chciał przytoczyć go tutaj na forum, to nie da rady bo kilkunastokrotnie przekracza to możliwą długość posta. Dla 10ciu pobranych artykułów na bank przeglądarka przestała by odpowiadać (mówię ciągle o var_dumpie() na tymże obiekcie)... Czy to ja robię coś nie tak, czy też wszystko jest "w porządku" (czyt. nikt na to nie zwraca uwagi, nawet nie wie co to var_dump())?

pozdro.

Ten post edytował Ravv 6.02.2009, 10:02:00
Go to the top of the page
+Quote Post
AxZx
post
Post #6





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


ja się zastanawiam czy to z czym Ty masz problem było rozważane przez autorów Propela. przecież nad tym pracują ludzie raczej myślący. dlaczego oni takich problemów nie mają? dlaczego mimo wszystko wypuścili taką aplikację i dlaczego była ona dołączona do dosyć sporego frameworka Symfony? czyżby to wszystko było nieporozumieniem?
tak się tylko zastanawiam:)


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
Ravv
post
Post #7





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 8.02.2006

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


Budując system do obsługi bloga, do obsługi galerii internetowej, do obsługi katalogu on-line - tak, można sobie pozwolić na zajęcie pamięci rzędu kilkunastu / kilkudziesięciu MB dla jednego żądania.... Ale np. robiąc portal, zaawansowany sklep itp - każdy MB zasobów jest na wagę złota. Z resztą błędy typu 'Memory Exhausted' są wg Ciebie przewidziane przez twórców? Pewnie nie, nawet przy ogromnych projektach...

Dlatego pewnie robię gdzieś błąd, ale nie wiem gdzie. Jeżeli normalne jest że pobranie tylko 3 wierszy z bazy (powiązanych przeróżnymi relacjami kilku tabel) zajmuje horrendalną ilość pamięci i tak ma być - to cieszę się że nie robię nigdzie błędu.

Może źle to wszystko zabrzmiało co do tej pory napisałem -> nie chcę się kłócić, polemizować itp. bo się na tym nie znam. Wiem tylko tyle że wyciągając z bazy te durne trzy wiersze zjada mi 2MB pamięci, a var_dump() jest olbrzymi. Stąd moje rozważania, ubolewania itp.

Nigdy nie mieliście z tym problemów robiąc duże projekty?
Mi to jakoś spokoju nie daje :/.
Go to the top of the page
+Quote Post
AxZx
post
Post #8





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


może coś z var_dump jest nie tak? też jak sprawdzam dla 12 wierszy z bazy (trochę joinów) to apache dostaje zadyszki i nie odpowiada. ale może to nie o to chodzi?

myślę, że twórcy Symfony nie stworzyli tego frameworka do budowy bloga czy innych takich skromnych aplikacji:)

spróbuj Doctrine i najnowszego Symfony 1.2.4 - zobacz czy tam var_dump też zawiesza apache.


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
Ravv
post
Post #9





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 8.02.2006

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


Z tego co wiem to Doctrine jest tak samo zasobożerny. Pobierane są chyba wszystkie powiązane ze sobą rekordy, nawet jak ich nie chcesz (i to nawet po kilka razy te same, co widać po var_dumpie). Tak gwoli zasady "a może programista będzie chciał ich użyć".

Kumpel który jest programistą nie-amatorem mówił że przy projektach robionych przez firmę gdzie pracował często zdarzało się że przy chęci wyciągnięcia 5ciu wierszy Doctrine pobierało dodatkowych kilkaset co powodowało błedy "Fatal error: Memory Exhausted..."... Patrząc na var_dumpy() wcale się nie dziwię.
No i dlatego jakoś mam obawy w korzystaniu z Propela/Doctrine w Symfony przez doSelect, doSelectJoinAll itp. Jak aplikacja mi się rozrośnie i nagle zaczną się sypać błędy z pamięcią to nie pozostani nic innego jak przebudowa wszystkiego :/.

Ten post edytował Ravv 6.02.2009, 11:55:46
Go to the top of the page
+Quote Post
SongoQ
post
Post #10





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


@Ravv pomijajac juz sens propela bo to juz mam nadzieje ze wyjasnione. W SQLu ktory podales ktory wyrzuca propel masz tam jakiegos CROS JOIN "FROM `article` CROSS JOIN `thema`" podaj jakie kryteria ustawiasz.

Odnosnie tej pamieci napisze to kolejny raz - zwracasz wiecej wynikow, pol to tym wiecej pamieci PHP potrzebuje na obsluzenie tego - to chyba oczywiste. Jesli chesz optymalizowac dbac o pamiec to widoki sa 1 krokiem do tego.


--------------------
Go to the top of the page
+Quote Post
Ravv
post
Post #11





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 8.02.2006

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


Baza:

  1. propel:
  2. [b]thema[/b]:
  3. id: ~
  4. name: { type: varchar(100), required: true }
  5. is_published: { type: BOOLEAN, required: true, DEFAULT: 1 }
  6. created_at: ~
  7.  
  8. [b]category[/b]:
  9. id: ~
  10. name: { type: varchar(100), required: true }
  11. is_published: { type: BOOLEAN, required: true, DEFAULT: 1 }
  12. created_at: ~
  13.  
  14. [b]thema_category[/b]:
  15. thema_id: { type: integer, foreignTable: thema, foreignReference: id, required: true, primaryKey: true, onDelete: cascade }
  16. category_id: { type: integer, foreignTable: category, foreignReference: id, required: true, primaryKey: true, onDelete: cascade }
  17.  
  18. [b]article[/b]:
  19. id: ~
  20. category_id: { type: integer, foreignTable: category, foreignReference: id, required: true }
  21. region_id: { type: integer, foreignTable: region, foreignReference: id }
  22. picture: { type: varchar(255) }
  23. title: { type: varchar(255), required: true }
  24. short_desc: { type: longvarchar }
  25. DESC: { type: longvarchar, required: true }
  26. is_published: { type: BOOLEAN, required: true, DEFAULT: 1 }
  27. created_at: ~
  28. updated_at: ~


Cel: pobranie trzech najnowszych artykułów. Artykuły muszą mieć status opublikowanych, kategorie do których należą również, tematy do których należą kategorie - też muszą mieć status opublikowane.

Kryteria:
  1. <?php
  2. $c = new Criteria();
  3. $c->add( ArticlePeer::IS_PUBLISHED, true );
  4. $c->add( CategoryPeer::IS_PUBLISHED, true );
  5. $c->add( ThemaPeer::IS_PUBLISHED, true );
  6. $c->addDescendingOrderByColumn( ArticlePeer::CREATED_AT );
  7. $c->setLimit( 3 );
  8. return ArticlePeer::doSelectJoinAll($c);
  9. ?>


Generowane zapytanie:
  1. SELECT article.ID, article.CATEGORY_ID, article.REGION_ID, article.PICTURE, article.TITLE, article.SHORT_DESC, article.DESC, article.IS_PUBLISHED, article.CREATED_AT, article.UPDATED_AT, category.ID, category.NAME, category.IS_PUBLISHED, category.CREATED_AT, region.ID, region.NAME FROM `article` CROSS JOIN `thema` LEFT JOIN category ON (article.CATEGORY_ID=category.ID) LEFT JOIN region ON (article.REGION_ID=region.ID) WHERE article.IS_PUBLISHED=1 AND category.IS_PUBLISHED=1 AND thema.IS_PUBLISHED=1 ORDER BY article.CREATED_AT DESC LIMIT 3


var_dump'a nie wrzucę bo za duży, ale z tego co na szybkiego widzę stworzono po 13 obiektów tego samego artykułu (czyli 39 obiektów Article) itd.

Wiem że gdzieś robię błąd (oby!), dlatego byłbym rad za wskazanie.

Ten post edytował Ravv 6.02.2009, 13:03:15
Go to the top of the page
+Quote Post
SongoQ
post
Post #12





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


No to teraz zobacz - ArticlePeer::doSelectJoinAll($c); pobiera Ci obiekty Article wraz z powiazanymi, nigdzie nie wyspepuje w kluczu thema. Zeby to wszystko polaczyc musisz dodac $c->addJoin( pole, pole );


--------------------
Go to the top of the page
+Quote Post
Ravv
post
Post #13





Grupa: Zarejestrowani
Postów: 24
Pomógł: 0
Dołączył: 8.02.2006

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


Zacząłem kombinować z tymi kryteriami sukcesywnie zmniejszając liczbę powtórzeń obiektów. Niestety przy doSelectJoinAll() najmniejszy wynik to 6 (docelowo: 3). Próbowałem przez doSelect() i 3 addJoin'y -> prawie zadowalający wynik - 3 artykuły, ale bez powiązanych obiektów.

Tak w ogóle to w dokumentacji jest błąd, konkretnie > TUTAJ <, ponieważ pokazany przykład nie jest tożsamy z podanym tam zapytaniem, ponieważ zamiast SELECT * ..., doSelect() pobiera tylko kolumny z jednej tabeli :/. Szkoda... Coś czuję że znów czeka mnie nieprzespana noc by dojść do tego jak powinny wyglądać te kryteria, by dostać 3 obiekty artykułów + obiekty powiązane z każdym z nich.

Zły Propel, zły! Jak się walą w dokumentacji, ehh...

Ten post edytował Ravv 6.02.2009, 14:26:49
Go to the top of the page
+Quote Post
SongoQ
post
Post #14





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


Jest tak jak powinno byc. W jednym zapytaniu chesz otrzymac obiekty zalezne ale pomiedzy nimi jest jeszcze tabela. Najrozsadniej jest uzyc widok i wtedy zwracasz co chcesz.


--------------------
Go to the top of the page
+Quote Post
AxZx
post
Post #15





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


utworzyć widok w bazie to jest jedno rozwiązanie, innym może być samemu utworzenie albo poprawienie metod doselectjoinall.


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
SongoQ
post
Post #16





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


@AxZx Tylko poprawienie metod nie zmieni Ci zbyt wiele w ilosci zajetej pamieci, chyba ze bedziesz zwracal odpowiednie pola, ale to zawsze cos.


--------------------
Go to the top of the page
+Quote Post
AxZx
post
Post #17





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


a po co tworzyć widoki? po co w ogóle robić te dodatkowe metody? tzn po co zmuszać Propela do generowania dodatkowych metod? można w schema.yml nie podawać kluczy obcych - wtedy nie będzie dodatkowych obiektów dołączał, które czasem są nie przydatne.

a jak później jest z hydrate takiego widoku? gdy chcemy mieć dane z 5 tabel? nie będzie problemów?


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
SongoQ
post
Post #18





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


Widok w propelu to tak naprawde model do oczytu. A jakie dane sa zwracane to tylko zalezy od struktury vidoku. Hydrate w Propelu jest defaultowy. Postaram sie art zrobic i wrzuce na bloga to pozniej podesle link z przykladami. Czesto takie zabiegi stosujemy w pracy w celu przyspieszenia Propela i zmniejszenia pamieci.


--------------------
Go to the top of the page
+Quote Post
AxZx
post
Post #19





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


aaa, rozumiem. czyli po prostu w schema.yml tworzysz widok a nie tabele?
tylko to jest chyba strasznie sztywne rozwiązanie.
no i jeszcze nie wiem za bardzo jak to ugryźć.
załóżmy, że mam model profil. tam nadpisałem metody lub stworzyłem nowe metody np. getNazwa, setPseudonim itd.
tworząc widok, który miałby pobierać dane profilu połączone jeszcze z 5 innymi metodami z których metod będę mógł skorzystać? czy tych z modelu profil czy tylko tych z modelu tego widoku?smile.gif

EDIT:

już wiem o co chodzi
http://zawadzinski.com/2008/01/15/how-to-u...ews-in-symfony/

trzeba będzie spróbować to wdrożyć:) a nie czekać, aż serwer sam zdechnie. aczkolwiek nie wiem czy jest sens, bo może się okazać, że taniej wyjdzie przenieść się na dedyka i dokładać RAM.


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
SongoQ
post
Post #20





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

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


Uwierz mi ze nawet jesli przenieszesz to na dedyka ( nawet bardzo dobrego - RAM, CPU ) i dalej bedziesz mial tyle zaleznych obiektow to i on nie da rady, wiem to z doswiadczenia. Takie rzeczy od razu robic podczas fazy 1 implementacji. Rozumiem ze sie projekt moze zmieniac ale trzeba o tych rzeczach myslec - wiele opinii jest na temat Symfony ze to pamieciozerne, ze wolno chodzi - a prawda jest taka, ze jak sie nie mysli o tych rzeczach to taka teorie mozna przyjac, ktora jest dla mnie bardziej brakiem doswiadczenia niz bledna koncepcja developerow symfony. Zasada jest prosta - zwracaj to co Ci jest potrzebne.

Symfony - przyśpieszanie Propela z wykorzystaniem widoków (view) baz danych

Ten post edytował SongoQ 7.02.2009, 13:02:41


--------------------
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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 Aktualny czas: 21.08.2025 - 15:09