Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] Ilość zwracanych danych po odp bazy
Forum PHP.pl > Forum > PHP > Frameworki
Ravv
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.
SongoQ
Najlepszym rozwiazaniem jest vidok. Dodaje sporego kopa jesli chodzi o wydajnosc wyciagania danaych i wielki spadek zuzycia pamieci.
Ravv
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
SongoQ
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.
Ravv
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.
AxZx
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:)
Ravv
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 :/.
AxZx
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.
Ravv
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 :/.
SongoQ
@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.
Ravv
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.
SongoQ
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 );
Ravv
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...
SongoQ
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.
AxZx
utworzyć widok w bazie to jest jedno rozwiązanie, innym może być samemu utworzenie albo poprawienie metod doselectjoinall.
SongoQ
@AxZx Tylko poprawienie metod nie zmieni Ci zbyt wiele w ilosci zajetej pamieci, chyba ze bedziesz zwracal odpowiednie pola, ale to zawsze cos.
AxZx
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?
SongoQ
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.
AxZx
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.
SongoQ
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
AxZx
a można zrobić tak jak pisałem wcześniej?
że w schema.yml nie podajesz kluczy obcych (powiązanych tabel) i wtedy propel nie będzie tworzył tych ogromnie długich plików modeli. a złączenia można robić samemu, samemu utworzyć metody, które łączą i zwracają tylko to co trzeba.
SongoQ
Tylko jak bedziesz pobieral juz w template zalezne dane to i tak zwroci Ci caly rekord + dodatkowe zapytanie a jak uzyjesz do addJoin to na to samo wyjdzie.
AxZx
no nie zupełnie. bo wtedy w addjoin będzie dołączana tylko jedna tabela. tak mi się wydaje;) ale wydaje mi się, że już nic z tego nie rozumiem. symfony oferuje dużo możliwości. po co w takim razie z niego korzystać jak i tak trzeba samemu kombinować.
czy to znaczy, że symfony jest do robienia 'stronek' dla nie więcej niż powiedzmy 1000 odwiedzin dziennie?
SongoQ
A wyobrazasz sobie kryteria do 3 tabel z grupowaniem i innymi kombinacjami? A tak to przygotowujesz widok w SQL dodajesz do schema i budujesz i masz gotowe dane, tylko takie jakie maja byc wykorzystane, po co wyciagac niepotrzebne zalezne dane.
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.