2012-06-10 3 views
5

저는 웹 애플리케이션 프로젝트에서 Symfony로 Doctrine을 사용하고 있습니다.어떤 필드로 인해 Doctrine이 데이터베이스를 다시 쿼리하게합니까?

저는 데이터베이스에서 필요한 필드 만 선택하기 위해 이러한 프로젝트에서 많은 쿼리를 최적화했습니다. 그러나 시간이 지남에 따라 새로운 기능이 추가되었고 몇 가지 경우에는 추가 필드가 코드에 사용되어 Doctrine Lazy Loader가 데이터베이스를 다시 쿼리하고 일부 페이지의 쿼리 수가 3에서 100 +

으로 증가했습니다

그래서 모든 필수 입력란을 포함하도록 원래 검색어를 업데이트해야합니다. 그러나 Doctrine이 어떤 필드에서 추가 쿼리를 발행하는지 기록하는 쉬운 방법은 보이지 않습니다. 따라서 원래 쿼리에없는 필드의 사용법을 찾아내는 코드를 살펴 보는 것은 힘든 일입니다.

getter가 수화되지 않은 필드에 액세스 할 때 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

이 내가 복용 종료 된 경로입니다 Doctrine_EventListener를 확장하는 클래스를 만듭니다. –

1

그냥 SQL 로깅을 설정하면 별명에서 유죄를 추론 할 수 있습니다 :이 부분은 당신이 해결책을 찾는다해야하는 위치라고 생각합니다. Doctrine 1.2에서이 작업을 수행하는 방법은 post을 참조하십시오. 기본적으로

: 이벤트 리스너

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는 Doctrine 1을 사용합니다. – j0k