5

いくつかの Web アプリ プロジェクトで Doctrine と Symfony を使用しています。

これらのプロジェクトの多くのクエリを最適化して、データベースから必要なフィールドだけを選択しました。しかし、時間の経過とともに新しい機能が追加され、いくつかのケースでは、追加のフィールドがコードで使用され、Doctrine レイジー ローダーがデータベースを再クエリし、一部のページでのクエリ数が 3 から 100 以上になりました。

そのため、元のクエリを更新して、すべての必須フィールドを含める必要があります。しかし、Doctrine が追加のクエリを発行する原因となったフィールドをログに記録する簡単な方法はないようです。そのため、元のクエリにないフィールドの使用法を探してコードをふるいにかけるのは骨の折れる仕事になります。

ハイドレートされていないフィールドに getter がアクセスしたときに Doctrine のログを記録する方法はありますか?

4

2 に答える 2

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();
        }
于 2012-06-21T05:49:16.677 に答える
1

SQL ロギングをオンにするだけで、エイリアス名から有罪のものを推測できます。Doctrine 1.2 でそれを行う方法については、この投稿を参照してください。

基本的に: 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);
于 2012-10-03T20:16:51.013 に答える