2012-06-10 4 views
5

Я использую Doctrine с Symfony в нескольких проектах веб-приложений.Определение того, какое поле вызывает Doctrine для повторного запроса базы данных

Я оптимизировал многие запросы в этих проектах, чтобы выбрать только те поля, которые необходимы из базы данных. Но с течением времени были добавлены новые функции, а в нескольких случаях - в коде используются дополнительные поля, в результате чего ленивый загрузчик Doctrine повторно запрашивает базу данных и управляет количеством запросов на некоторых страницах от 3 до 100+

Поэтому мне нужно обновить исходный запрос, чтобы включить все необходимые поля. Тем не менее, нетрудно догадаться, почему Doctrine регистрирует, какое поле вызывает выдачу дополнительного запроса, поэтому становится сложной задачей просеивать код, ищущий использование полей, которые не находятся в исходном запросе.

Есть ли способ иметь журнал Doctrine, когда геттер обращается к полю, которое не было гидратировано?

ответ

1

У меня не было этой проблемы, но я просто посмотрел на класс Doctrine_Record. Вы пытались добавить некоторый отладочный вывод в метод _get()? Я думаю, что эта часть, где вы должны искать решение:

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

Это маршрут я закончил тем, что брал. –

1

Просто включите ведение журнала SQL, и вы можете вывести виновный из имен псевдонимов. Как это сделать в Доктрине 1.2 см. Это post.

В основном: создать класс, который расширяет 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; 
    } 
} 

И добавить слушатель события:

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

Это для Doctrine2. OP использует Доктрину 1. – j0k

 Смежные вопросы

  • Нет связанных вопросов^_^