Используя Symfony 1.4 и доктрину, я хотел бы сохранить полученную модель в другое соединение с базой данных:
- извлечение модели из базы данных master
- изменить подключение базы данных к ведомой базе данных
- сохранить модель в ведомой базе данных
У меня есть 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);
надеюсь, это поможет, если кто-то споткнется.