繁体   English   中英

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

[英]How to set the default hydrator in Doctrine?

我找不到在Doctrine中设置默认保水器的方法。 它应该可用。 对?

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

上述文档页面介绍了如何创建自定义保湿器。 这里的缺点是每次执行查询时都需要“指定”水化器。

我通过阅读Chris Gutierrez的评论和改变一些内容来解决这个问题。

首先,为Doctrine_Query定义扩展类。 扩展构造函数以定义您自己的水合模式。

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
        }
    }
}

然后,在你的引导程序中,告诉Doctrine你的新课程。

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

Chris Gutierrez定义了连接的属性而不是全局,但我有多个连接,我想对所有连接使用此默认值。

现在,每次构建查询时都不必调用Doctrine_Query :: setHydrationMode()。

这是更多信息
http://www.doctrine-project.org/projects/orm/1.2/docs/manual/configuration/en#configure-query-class

编辑:以下更改

我发现上面有问题了。 具体来说,做“Doctrine_Core :: getTable('Model') - > find(1)”之类的东西将始终返回一个水合数组,而不是一个对象。 所以我稍微修改了一下,定义了在Query调用中使用的自定义执行方法。

另外,我添加了内存释放代码。

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;
    }
}

这是一个好主意,在阅读你的问题时,我认为这是你可以通过Doctrine做的事情。 但是,阅读代码会让我觉得你不能:

Doctrine_Query::create()创建一个新查询,仅指定Doctrine_Query_Abstract::__construct()的第一个参数,即连接,而不指定第二个参数 - 水合模式。 没有调用配置。 由于没有传递水化器,因此创建了一个新的Doctrine_Hydrator ,它的构造函数同样不会查找配置选项的任何位置,因此它具有默认的Doctrine::HYDRATE_RECORD设置。

也许使用以下工厂方法继承Doctrine_Query是最简单的选择?

public static function create($conn = null)
{
    return new Doctrine_Query($conn,Doctrine::HYDRATE_ARRAY);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM