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 回答