duanmu5039 2010-01-14 13:55
浏览 61
已采纳

如何在Doctrine中设置默认水化器?

I can't find a way to set the default hydrator in Doctrine. It should be available. Right?

http://docs.doctrine-project.org/projects/doctrine1/en/latest/en/manual/data-hydrators.html#writing-hydration-method

The above documentation page explains how to create a custom hydrator. The drawback here is that you need to "specify" the hydrator each and every time you execute a query.

  • 写回答

2条回答 默认 最新

  • dongxu4023 2010-08-24 20:59
    关注

    I figured this out by reading Chris Gutierrez's comment and changing some stuff.

    First, define an extension class for Doctrine_Query. Extend the constructor to define your own hydration mode.

    class App_Doctrine_Query extends Doctrine_Query
    {
        public function __construct(Doctrine_Connection $connection = null,
            Doctrine_Hydrator_Abstract $hydrator = null)
        {
            parent::__construct($connection, $hydrator);
            if ($hydrator === null) {
                $this->setHydrationMode(Doctrine::HYDRATE_ARRAY); // I use this one the most
            }
        }
    }
    

    Then, in your bootstrap, tell Doctrine about your new class.

    Doctrine_Manager::getInstance()->setAttribute(Doctrine_Core::ATTR_QUERY_CLASS, 'App_Doctrine_Query');  
    

    Chris Gutierrez defined the attribute for the connection instead of globally but I have more than one connection and I want to use this default for all of them.

    Now you don't have to call Doctrine_Query::setHydrationMode() every time you build a query.

    Here's more information
    http://www.doctrine-project.org/projects/orm/1.2/docs/manual/configuration/en#configure-query-class

    EDIT: Changes below

    I have found a problem with the above. Specifically, doing something like "Doctrine_Core::getTable('Model')->find(1)" will always return a hydrated array, not an object. So I have altered this a bit, defining custom execute methods for use in a Query call.

    Also, I added memory freeing code.

    class App_Doctrine_Query extends Doctrine_Query
    {
        public function rows($params = array(), $hydrationMode = null)
        {
            if ($hydrationMode === null)
                $hydrationMode = Doctrine_Core::HYDRATE_ARRAY;
            $results = parent::execute($params, $hydrationMode);
            $this->free(true);
            return $results;
        }
    
        public function row($params = array(), $hydrationMode = null)
        {
            if ($hydrationMode === null)
                $hydrationMode = Doctrine_Core::HYDRATE_ARRAY;
            $results = parent::fetchOne($params, $hydrationMode);
            $this->free(true);
            return $results;
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值