2012-06-10 7 views
5

Estoy usando Doctrine con Symfony en un par de proyectos de aplicaciones web.Determinar qué campo hace que Doctrine vuelva a consultar la base de datos

He optimizado muchas de las consultas en estos proyectos para seleccionar solo los campos necesarios de la base de datos. Pero con el tiempo se han agregado nuevas características y, en un par de casos, se utilizan campos adicionales en el código, lo que hace que Doctrine lazy loader vuelva a consultar la base de datos y genere el número de consultas en algunas páginas del 3 al 100+

Por lo tanto, debo actualizar la consulta original para incluir todos los campos obligatorios. Sin embargo, Doctrine no parece una forma fácil de registrar qué campo provoca que se emita la consulta adicional, por lo que se convierte en un trabajo arduo examinar el código buscando el uso de campos que no están en la consulta original.

¿Hay alguna forma de tener Doctrine log cuando un getter accede a un campo que no se ha hidratado?

Respuesta

1

No he tenido este problema, pero solo miré en la clase Doctrine_Record. ¿Has intentado agregar algún resultado de depuración al método _get()? Creo que esta parte es donde se debe buscar una solución:

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

Esta es la ruta que terminé tomando. –

1

Sólo activar el registro de SQL y se puede deducir el culpable de nombres de alias. Para saber cómo hacerlo en Doctrine 1.2, vea esto post.

Básicamente: crear una clase que se extiende 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; 
    } 
} 

Y añadir el detector de eventos:

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

Esto es para Doctrine2. OP usa Doctrine 1. – j0k

Cuestiones relacionadas