[英]How to set the default hydrator in Doctrine?
我找不到在Doctrine中設置默認保水器的方法。 它應該可用。 對?
上述文檔頁面介紹了如何創建自定義保濕器。 這里的缺點是每次執行查詢時都需要“指定”水化器。
我通過閱讀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.