我有一个复杂的数据结构,这意味着我无法完全使用schema.yml中为我的模型定义的关系。
现在我有一些报告查询需要使用来自多个数据库的表。
由于模型的复杂性,这些查询是用原始sql编写的。所以我需要在查询中使用数据库名称,以便为各种表选择正确的数据库。
我正在使用symfony 1.4和Doctrine 1.2
如何从databases.yml中提取当前环境(Prod,Dev,Test等)的数据库名称,以便在原始sql查询中使用它们?
答案 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);
我认为这是一个非常常见的问题,这段代码解决了大多数情况。