2012-06-10 7 views
5

私は、いくつかのWebアプリケーションプロジェクトでSymfonyでDoctrineを使用しています。どのフィールドで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

これは私が取ってしまったルートがあるのDoctrine_EventListenerを拡張するクラスを作成します。 –

1

ちょうどSQLのログをオンにして、あなたは、別名から有罪1を推測することができます:私は、この部分はあなたが解決策を探す場所だと思います。 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

関連する問題