2012-06-10 4 views
5

Używam Doctrine z Symfony w kilku projektach aplikacji internetowych.Określanie, które pole powoduje, że Doctrine ponownie przesyła zapytanie do bazy danych

Zoptymalizowałem wiele zapytań w tych projektach, aby wybrać tylko potrzebne pola z bazy danych. Ale z biegiem czasu dodano nowe funkcje i - w kilku przypadkach - w kodzie użyto dodatkowych pól, powodując, że leniwy program Doctrine ponownie przesyła zapytanie do bazy danych i generuje liczbę zapytań na niektórych stronach od 3 do 100+

Muszę więc zaktualizować pierwotne zapytanie, aby zawierało wszystkie wymagane pola. Jednak nie wydaje się, aby Doctrine mógł w łatwy sposób rejestrować, które pole powoduje wysłanie dodatkowego zapytania, więc dokładne przeszukanie kodu wymaga użycia wielu pól, których nie ma w pierwotnym zapytaniu.

Czy istnieje sposób na zapisywanie Doctrine, gdy getter uzyskuje dostęp do nie nawodnionego pola?

Odpowiedz

1

Nie miałem tego problemu, ale popatrzyłem tylko na klasę Doctrine_Record. Czy próbowałeś dodać jakieś wyjście debugowania do metody _get()? Myślę, że ta część, gdzie należy szukać rozwiązania:

if (array_key_exists($fieldName, $this->_data)) { 
     // check if the value is the Doctrine_Null object located in self::$_null) 
     if ($this->_data[$fieldName] === self::$_null && $load) { 
      $this->load(); 
     } 
+0

Jest to trasa I skończyło się. –

1

Wystarczy włączyć rejestrowanie SQL i można wywnioskować winnego jednego z nazwy aliasu. Aby dowiedzieć się, jak to zrobić w Doctrine 1.2, patrz: post.

Zasadniczo: utworzyć klasę, która rozciąga Doctrine_EventListener:

class QueryDebuggerListener extends Doctrine_EventListener 
{ 
    protected $queries; 

    public function preStmtExecute(Doctrine_Event $event) 
    { 
     $query = $event->getQuery(); 
     $params = $event->getParams(); 

     //the below makes some naive assumptions about the queries being logged 
     while (sizeof($params) > 0) { 
      $param = array_shift($params); 

      if (!is_numeric($param)) { 
       $param = sprintf("'%s'", $param); 
      } 

      $query = substr_replace($query, $param, strpos($query, '?'), 1); 
     } 

     $this->queries[] = $query; 
    } 

    public function getQueries() 
    { 
     return $this->queries; 
    } 
} 

i dodać detektor zdarzeń:

$c = Doctrine_Manager::connection($conn); 
$queryDbg = new QueryDebuggerListener(); 
$c->addListener($queryDbg); 
+0

To jest dla Doctrine2. OP używaj Doctrine 1. – j0k

Powiązane problemy