2012-06-10 14 views
5

Uso Doctrine con Symfony in un paio di progetti di app Web.Determinare quale campo fa sì che Doctrine riesamini il database

Ho ottimizzato molte delle query in questi progetti per selezionare solo i campi necessari dal database. Ma nel tempo sono state aggiunte nuove funzionalità e, in un paio di casi, vengono utilizzati campi aggiuntivi nel codice, facendo sì che il caricatore pigro di Doctrine riesamini il database e determini il numero di query su alcune pagine da 3 a 100+

Quindi ho bisogno di aggiornare la query originale per includere tutti i campi richiesti. Tuttavia, non sembra un modo semplice per Doctrine di registrare quale campo fa emettere la query aggiuntiva - quindi diventa un lavoro scrupoloso per setacciare il codice cercando l'utilizzo di campi che non sono nella query originale.

C'è un modo per avere Doctrine Log quando un getter accede a un campo che non è stato idratato?

risposta

1

Non ho avuto questo problema, ma ho appena guardato alla classe Doctrine_Record. Hai provato ad aggiungere un output di debug al metodo _get()? Penso che questa parte è dove si dovrebbe cercare una soluzione:

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

Questo è il percorso Ho finito per prendere. –

1

Basta attivare la registrazione SQL e si può dedurre il colpevole da nomi di alias. Per come farlo in Doctrine 1.2 vedere questo post.

Fondamentalmente: creare una classe che si estende 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; 
    } 
} 

E aggiungere il listener di eventi:

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

Questo è per Doctrine2. OP usa Doctrine 1. – j0k

Problemi correlati