Получить имена баз данных / информацию DSN из symfony / doctrine database.yml - PullRequest
2 голосов
/ 11 сентября 2011

У меня сложная структура данных, что означает, что я не смог полностью использовать отношения, определенные в schema.yml для моей модели.

Теперь у меня есть несколько отчётных запросов, в которых нужно использовать таблицы из нескольких баз данных.

Из-за сложности модели эти запросы пишутся в формате raw sql. Поэтому мне нужно использовать имена баз данных в запросе, чтобы выбрать правильные базы данных для различных таблиц.

Я использую Symfony 1.4 и Doctrine 1.2

Как я могу извлечь имена баз данных для моей текущей среды (Prod, Dev, Test и т. Д.) Из database.yml, чтобы использовать их в необработанных SQL-запросах?

Ответы [ 3 ]

1 голос
/ 27 сентября 2011

Я уверен, что должен быть лучший способ, но оказывается, что вы можете получить DSN из sfDatabaseManager. Поэтому, пока я не найду правильный путь, я расширил 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');

Просто нужно взорвать / regex на dsn, чтобы получить dbname.

Я ЛЮБЛЮ это, если кто-то напишет, чтобы рассказать мне, как это мусор, но, конечно, только если у них есть лучшее решение! Я посмотрел, посмотрел и посмотрел ....

1 голос
/ 11 сентября 2011

Если вы используете Symfony с Doctrine, вы, вероятно, сгенерировали все модели (если вы не были вынуждены использовать необработанный 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();

И затем написать свой запрос, используя найденную информацию.

0 голосов
/ 14 июня 2012

Достиг того же результата с помощью:

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

Я думаю, что это очень распространенная проблема, и этот код решает большинство случаев.

...