Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] backend + i18n + duża liczba zapytań SQL
Forum PHP.pl > Forum > PHP > Frameworki
phpion
Witam!
Mam pewien problem z ograniczeniem liczby zapytań SQL w backendzie przy pracy z wersjami językowymi (tabele standardowe attraction oraz attraction_i18n).

Mój generator.yml wygląda następująco:
Kod
...
    list:
      title: Attractions list
      display: [_icon, name, is_active]
      filters: [is_active]
      object_actions:
        _edit: ~
        _delete: ~
      peer_method:   doSelectWithI18nIfExists
...

gdzie metoda doSelectWithI18nIfExists() wygląda tak:
  1. <?php
  2. public static function doSelectWithI18nIfExists(Criteria $c, $culture = null, $con = null) {
  3. $return = array();
  4.  
  5. $connection = sfContext::getInstance()->getDatabaseConnection(AttractionPeer::DATABASE_NAME);
  6. $query = 'SELECT a.id, a.icon, ai.name FROM attraction a LEFT OUTER JOIN attraction_i18n a
    i ON a.id=ai.id AND (ai.culture="pl_PL" OR ai.culture IS NULL)'
    ;
  7. $stmt = $connection->prepareStatement($query);
  8. $rs = $stmt->executeQuery();
  9.  
  10. foreach($rs as $r) {
  11. $obj = new Attraction();
  12. $obj->setId($r['id']);
  13. $obj->setName($r['name']);
  14. $obj->setIcon($r['icon']);
  15.  
  16. array_push($return, $obj);
  17. }
  18.  
  19. return $return;
  20. }
  21. ?>

Problem w tym, że w adminie wykonuje mi się masa zbędnych zapytań (myślałem, że rozwiążę to poprzez utworzenie innej metody pobierającej dane):
  1. [0.31 ms] SELECT COUNT(attraction.ID) FROM attraction
  2. [0.88 ms] SELECT a.id, a.icon, ai.name FROM attraction a LEFT OUTER JOIN attraction_i18n ai ON a.id=ai.id AND (ai.culture='pl_PL' OR ai.culture IS NULL)
  3. [0.31 ms] SELECT attraction_i18n.NAME, attraction_i18n.ID, attraction_i18n.CULTURE FROM attraction_i18n WHERE attraction_i18n.ID=1 AND attraction_i18n.CULTURE IS NULL
  4. [0.25 ms] SELECT attraction_i18n.NAME, attraction_i18n.ID, attraction_i18n.CULTURE FROM attraction_i18n WHERE attraction_i18n.ID=2 AND attraction_i18n.CULTURE IS NULL
  5. ...

itd. dla każdego ID (w sumie 40 zapytań :|). Próbowałem wyłączyć w settings.yml ustawienie i18n ale i to nie przyniosło rezultatu. Pomyślałem, że może $obj->setName($v) jakoś wywołuje zapytanie SQL ale zakomentowanie tej linijki wcale nie zmienia liczby wykonywanych zapytań.

Więc moje pytanie jest takie: w jaki sposób wyeliminować te dodatkowe (zupełnie zbędne) zapytania?.

Pozdrawiam: pion
jupeter
Cześć Pion,

z tego co widzę, to metoda doSelectWithI18nIfExists w ogóle nie generuje tylu zapytań, stąd wniosek, że gdzieś to się dzieje poza nią.

Niestety nie korzystałem jeszcze z 'peer_method' w generator.yml, więc nie mam pojęcia gdzie szukać. Może przeleć się jakimś debugerem gdzie masz założony breakpoint na końcówce metody doSelectWithI18nIfExists i zobacz w którym miejscu wywołują się te selecty po wyjściu z metody?

P.
phpion
Dzięki za odpowiedź. Wydaje mi się, że te dodatkowe zapytania są wykonywane "z założenia". Sądziłem, że wyłączenie opcji i18n spowoduje iż nie zostaną one wykonane. Jednak co bym nie zrobił to zawsze są wykonywane.
Jeśli chodzi o debugery to nie miałem z nimi zbyt wiele do czynienia - ale powalczę, może do czegoś dojdę.
Gdyby w międzyczasie ktoś miał jakiś pomysł to byłbym wdzięczny za info.

// EDIT:

W cache metoda listująca dane wygląda w ten sposób:
  1. <?php
  2. public function executeList()
  3. {
  4. $this->processSort();
  5.  
  6. $this->processFilters();
  7.  
  8. $this->filters = $this->getUser()->getAttributeHolder()->getAll('sf_admin/attraction/filters');
  9.  
  10. // pager
  11. $this->pager = new sfPropelPager('Attraction', 20);
  12. $c = new Criteria();
  13. $this->addSortCriteria($c);
  14. $this->addFiltersCriteria($c);
  15. $this->pager->setCriteria($c);
  16. $this->pager->setPage($this->getRequestParameter('page', 1));
  17. $this->pager->setPeerMethod('doSelectWithI18nIfExists');
  18. $this->pager->init();
  19. }
  20. ?>

i za bardzo nie wiem, które miejsce produkuje tyle zapytań. Gdy wrócę z uczelni po prostu przeładuję tą metodę wywołując tylko doSelectWithI18nIfExists. Już oleję zabawę z pagerem bo może to on miesza...
Hmmm a może wiecie w jaki sposób w generator.yml wyłączyć stronicowanie?
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.