2011-09-11 16 views
1

私は複雑なデータ構造を持っています。つまり、私のモデルのschema.ymlで定義された関係を完全に使用することができませんでした。symfony/doctrine databases.ymlからデータベース名/ dsn情報を取得します。

今、いくつかのデータベースのテーブルを使用する必要のあるレポートクエリがあります。

モデルの複雑さのため、これらのクエリはraw SQLで記述されます。だから私は、さまざまなテーブルの正しいデータベースを選択するために、クエリでデータベース名を使用する必要があります。

私は生のSQLクエリでそれらを使用するためにはdatabases.ymlのからの私の現在の環境(製品版、デベロッパー、テストなど)のためのデータベース名を抽出することができますどのようにsymfony 1.4とDoctrine 1.2

を使用していますか?

+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()の全体でpreg_matchよりも洗練された方法があることを期待していました – petesiss

+0

DoctrineManagerが持つものはすべてここにあります:http://www.tig12。net/downloads/apidocs/symfony/lib/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine/Doctrine_Manager.class.html –

答えて

0

確かに良い方法が必要ですが、sfDatabaseManagerからDSNを取得することができます。

$appConfig= ProjectConfiguration::getApplicationConfiguration(sfConfig::get('sf_app'),  sfConfig::get('sf_env'), false);  
$dbManager= new sfDatabaseManagerExt($appConfig);  
$dsn=$dbManager->getDsn('doctrine'); 
:私は、適切な方法を見つけるまで、だから、私は特定の接続と環境のためのデータベース名を取得する必要があるモデルに続いて、次のgetDsn方法

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


} 

を追加するsfDatabaseManagerを拡張しました

dbnameを取得するには、dsnを/ regexする必要があります。

誰かが私にこのゴミがどのようにあるのかを教えてもらえればそれは大好きですが、もちろんもっと良い解決策がある場合に限ります。

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

私たちは複数のデータベースに、生のSQLクエリを送信しようとしている場合ことを追加したい:私は

1

Doctrineでsymfonyを使用している場合は、おそらくすべてのモデルが生成されているはずです(生の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

はと同じ結果を達成しました....見て、見て、見ていますプロジェクトでは、接続は、SQLを送信したいデータベースとモジュールに固有のものでなければなりません。

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

私はその非常に一般的な問題とこのコードはほとんどのケースを解決すると思います。

関連する問題