Скопируйте модель в другую базу данных в Symfony 1.4 - PullRequest
1 голос
/ 22 октября 2011

Используя Symfony 1.4 и доктрину, я хотел бы сохранить полученную модель в другое соединение с базой данных:

  1. извлечение модели из базы данных master
  2. изменить подключение базы данных к ведомой базе данных
  3. сохранить модель в ведомой базе данных

У меня есть 2 соединения, определенные в database.yml. здесь в псевдокоде:

$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 = $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 Ответ

1 голос
/ 26 октября 2011

Вы можете использовать метод 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);
...