确定哪个字段导致Doctrine重新查询数据库

时间:2012-06-10 11:44:41

标签: php orm doctrine doctrine-1.2

我在几个网络应用程序项目中使用了Sytrfony的Doctrine。

我已经优化了这些项目中的许多查询,只选择数据库中所需的字段。但随着时间的推移,新功能已经添加 - 在某些情况下 - 代码中使用了其他字段,导致Doctrine延迟加载器重新查询数据库并将某些页面上的查询数量从3个增加到100+ < / p>

所以我需要更新原始查询以包含所有必填字段。但是,Doctrine似乎没有一种简单的方法可以记录哪个字段导致发出附加查询 - 因此,查找代码以查找原始查询中不存在的字段的使用情况变成了一项艰苦的工作。 / p>

当一个getter访问一个没有被水合的字段时,有没有办法让Doctrine记录?

2 个答案:

答案 0 :(得分: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();
        }

答案 1 :(得分:1)

只需启用SQL日志记录,您就可以从别名中推断出有罪的一个。有关如何在Doctrine 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);