2011-09-11 44 views
1

我有一個複雜的數據結構,這意味着我無法完全使用schema.yml中定義的關係爲我的模型。從symfony/doctrine databases.yml檢索數據庫名稱/ dsn info

現在我有一些報表查詢需要使用來自多個數據庫的表。

由於模型的複雜性,這些查詢以原始sql編寫。所以我需要在查詢中使用數據庫名稱,以便爲各種表選擇正確的數據庫。

我使用symfony的1.4和1.2學說

我如何才能在原始的SQL查詢使用它們提取從databases.yml裏我目前的環境(產品,開發,測試等),數據庫的名字呢?

+0

http://stackoverflow.com/questions/2837659/in-symfony-1-2-how-can-i-get-the-current-database-name-from-the-database-yml-file –

+0

I看到了這一點,但我希望在整個Doctrine_Manager :: getInstance() – petesiss

+0

有一個更清晰的方式,而不是preg_match,所有'DoctrineManager'在這裏:http://www.tig12。net/downloads/apidocs/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Doctrine_Manager.class.html –

回答

0

我確定一定有更好的方法,但事實證明你可以從sfDatabaseManager獲取DSN。所以,直到我找到一個妥善的辦法,我已經擴展sfDatabaseManager添加以下getDsn方法

class sfDatabaseManagerExt extends sfDatabaseManager 
{ 
    public function getDsn($conn) 
    { 
    $db = $this->getDatabase($conn); 
    $dsn = $db->getParameter('dsn'); 
    return $dsn; 
    } 


} 

然後在模型中,我需要爲特定連接和環境得到數據庫名稱:

$appConfig= ProjectConfiguration::getApplicationConfiguration(sfConfig::get('sf_app'),  sfConfig::get('sf_env'), false);  
$dbManager= new sfDatabaseManagerExt($appConfig);  
$dsn=$dbManager->getDsn('doctrine'); 

只需要在dsn上展開/ regex然後獲取dbname。

我會喜歡它,如果有人會張貼告訴我這是多麼垃圾,但當然只有當他們有更好的解決方案!我已經看過了,看着看着....

1

如果你在使用symfony和Doctrine,你可能已經生成了所有的模型(如果你不是被迫使用原始SQL,我想你會用查詢生成器來執行查詢)。所有模型類都在其代碼中包含關於相關表的信息,因此您必須簡單地創建它們的實例並從內部檢索表名。看到這一點:

abstract class BaseModel extends sfDoctrineRecord 
    { 
    public function setTableDefinition() 
     { 
     $this->setTableName('models'); 
     $this->hasColumn(/* several definitions */); 

     $this->option('collate', 'utf8_general_ci'); 
     $this->option('charset', 'utf8'); 
     $this->option('type', 'InnoDB'); 
     } 
    } 

將有一類:

class Model extends BaseModel {} 

所以,你需要:

$model = new Model(); 
$tableName = $model->getTable()->getTableName(); 

,然後利用獲取的信息編寫查詢。

+0

這是一個好主意,但嘗試過它,它只返回表名。它不會預先輸入數據庫名稱,而是我需要的數據庫名稱。 – petesiss

+0

什麼阻止你保存(例如)app.yml中的前綴並用sfConfig讀取它,或者通過sfYaml類從databases.yml中讀取它? –

+0

是的。當我想不出別的什麼時,我試過了。現在在settings.yml中設置數據庫,並在databases.yml中使用常量。似乎一件愚蠢的事情,但必須做。 – petesiss

0

達到同樣的效果有:

$oCurrentConnection = Doctrine_Manager::getInstance()->getCurrentConnection(); 
$sdsn = $oCurrentConnection->getOption('dsn'); 

我想補充一點,如果我們要送一個原始的SQL查詢,在多個數據庫項目,連接必須是特定於我們想要發送sql的數據庫和模塊的連接。

if (!isset($sModuleName)) 
{ 
    $sModuleName = sfContext::getInstance()->getModuleName(); 
} 
$oCurrentConnection = Doctrine_Manager::getInstance()->getConnectionForComponent($sModuleName); 
$results = $oCurrentConnection->fetchAssoc($scomandoSQL); 

我認爲它是一個非常普遍的問題,這段代碼解決了大多數情況。