从symfony / doctrine databases.yml中检索数据库名称/ dsn信息

时间:2011-09-11 08:11:52

标签: php symfony1 doctrine

我有一个复杂的数据结构,这意味着我无法完全使用schema.yml中为我的模型定义的关系。

现在我有一些报告查询需要使用来自多个数据库的表。

由于模型的复杂性,这些查询是用原始sql编写的。所以我需要在查询中使用数据库名称,以便为各种表选择正确的数据库。

我正在使用symfony 1.4和Doctrine 1.2

如何从databases.yml中提取当前环境(Prod,Dev,Test等)的数据库名称,以便在原始sql查询中使用它们?

3 个答案:

答案 0 :(得分:1)

如果你正在使用带有Doctrine的symfony,你可能已经生成了所有模型(如果你没有被迫使用原始SQL,我想你会使用Query Builder进行查询)。所有模型类都在其代码中包含有关相关表的信息,因此您只需创建它们的实例并从内部检索表名。见:

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();

然后使用检索到的信息编写查询。

答案 1 :(得分:1)

我确定必须有更好的方法,但事实证明你可以从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上爆炸/正则表达式然后获取dbname。

如果有人发帖告诉我这是多么垃圾,我会很乐意,但当然只有他们有更好的解决方案!我看了看,看了看......

答案 2 :(得分: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);

我认为这是一个非常常见的问题,这段代码解决了大多数情况。