簡體   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