【问题标题】:Determining which field causes Doctrine to re-query the database确定哪个字段导致 Doctrine 重新查询数据库
【发布时间】:2012-06-10 11:44:40
【问题描述】:

我在几个 Web 应用项目中使用 Doctrine 和 Symfony。

我已经优化了这些项目中的许多查询,以便仅从数据库中选择所需的字段。但是随着时间的推移,已经添加了新功能,并且 - 在某些情况下 - 代码中使用了额外的字段,导致 Doctrine 惰性加载程序重新查询数据库并将某些页面上的查询数量从 3 提高到 100+

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

有没有办法在 getter 访问尚未水合的字段时记录 Doctrine?

【问题讨论】:

    标签: php orm doctrine doctrine-1.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();
            }
    

    【讨论】:

    • 这是我最终选择的路线。
    【解决方案2】:

    只需打开 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);
    

    【讨论】:

    • 这是给 Doctrine2 的。 OP使用原则1。
    猜你喜欢
    • 1970-01-01
    • 2011-11-26
    • 2022-06-28
    • 2016-04-23
    • 2021-09-04
    • 2016-03-19
    • 2012-03-10
    • 2016-04-18
    • 1970-01-01
    相关资源
    最近更新 更多