2011-10-21 11 views
1

内の別のデータベースへのモデル:コピー私は別のデータベース接続に取得したモデルを保存したいのSymfony 1.4と教義を使用してsymfonyの1.4

  1. は、マスター・データベースから
  2. 変更データベース接続をモデルを取得スレーブデータベース
  3. に私はdatabases.ymlの中で定義された2つの接続を持つスレーブデータベース

にモデルを保存します。擬似コードでは、ここで :

$model = [retrieved from master-database]; 
$slaveConnection = Doctrine_Manager::getInstance() 
    ->getConnection('slave-connection'); 
$model->save($slaveConnection); 

私は新しいモデルを作成する場合は、$model=new model();「コード」は、上記に成功スレーブ接続にモデルを保存します。

何が問題になりますか? Symfonyのログによれば、Symfonyはそのモデルを既存のものとして認識し、(挿入の代わりに)更新を発行します。

UPDATE model SET updated_at = '2011-10-21 17:37:32' WHERE id = '1'; 

symfonyは正しいデータベース接続(「スレーブ接続を」)を用いているが、モデルがまだ、スレーブデータベースに存在しないため、更新は失敗します。

そして、スレーブデータベースへの挿入は、変更されたモデルだけでなく、モデルのすべての値を使用する必要があります。

誰かが、既存のモデルを別のデータベースに保存する正しい方向を指摘できますか?

私の解決策で編集してください。

ありがとうございました!

ほんの一部追加: 深いコピーを実行した後、symfonyは新しいIDを保存しました。しかし、私は実際にモデルオブジェクトをスレーブdbにクローンしたいので、idを変更する必要がありました。 これは一意の制約例外を引き起こしたので、最初に削除する必要がありました。したがって、これは次のとおりです。

$id = $model->getId(); 
$slaveConnection->execute("delete from modeltable where id=".$id); 
$model_copy = $model->copy(true); # deep copy 
$model_copy->setId($id); 
$model_copy->save($slaveConnection); 

他人が遭遇した場合に役立ちます。

答えて

1

public function copy($deep = false)Doctrine_Recordクラスのメソッドを使用できます。

$model = [retrieved from master-database]; 
$slaveConnection = Doctrine_Manager::getInstance() 
    ->getConnection('slave-connection'); 
$model_copy = $model->copy(true); # deep copy 
$model_copy->save($slaveConnection); 
+0

ありがとうございます!これは正しい道に私を置く。完全性のために、別の答えを追加します。 –

+1

はい、オブジェクトが他のデータベースに存在するかどうかを確認する必要があります。 – samura

+0

私の場合ではない、テーブルからの削除id = xx "'は0の削除された行を返します。 –

関連する問題