Также, если это старый вопрос, может быть, ответ может быть полезен кому-то другому, поскольку это первый вопрос, который показывает Google.
Итак, вы не можете flush
одного объекта, но вы можете detach
им.
Таким образом, в вашем конкретном случае, вы можете сделать что-то вроде этого:
$em = $this->getDoctrine();
$entity1 = $em->find('\SomeEntity', 1);
$entity2 = $em->find('\SomeEntity', 2);
$entity1->setFoo(1);
$entity2->setFoo(2);
// At this point start the "new" code
// So, first detach $entity2
$em->detach($entity2); // Now the EntityManager doesn't know anymore of $entity2
$em->flush(); // entity1 is written to the DB at this point
// Add again $entity2 to the EntityManager
$em->persist($entity2);
$em->flush();
Очевидно, что это очень простой пример.
В реальном использовании, возможно, вы загрузили в EntityManager более двух объектов. В этом случае, также если вы detach($entity2)
может быть, что EntityManager с первым flush()
сохранит в базе данных также изменения, внесенные в другие загруженные объекты.
Итак, это решение должно использоваться с осторожностью.
Другим решением может быть использование clear()
: это отделяет все управляемые объекты. Он действительно похож на новый EntityManager, который только что инициализирован.
Я недавно использовал последнее решение, чтобы сохранить только частичные данные объекта, которые имеют некоторые связанные объекты, которые не должны быть сохранены.
Итак, я:
- Сначала очистил менеджер лица;
- Затем перезагрузили объект, который я обновлял;
- Имеет соответствующие модификации;
- промыта EntityManager
Это может быть немного сложно из очень конкретных флеши, и, конечно, было бы очень полезно иметь метод, чтобы сохранить только частично объект.
Но на данный момент эти подходы являются единственными возможными.
Это, наверное, ужасная идея. Я не могу сказать больше, не понимая, какую проблему вы пытаетесь решить.Я подозреваю, что вам что-то не хватает в том, что доктрина делает для вас, и пытаются решить проблему, которая либо не существует, либо ожидается в библиотеке. – timdev
В основном я хочу объекты, которые могут спасти себя, так что некоторые изменения БД можно сделать глубоко внутри кода модели, без необходимости программиста контроллера. – Tgr
timdev, причина использования фиксации одного объекта: 1), чтобы избежать запуска процесса отслеживания изменений, когда-то дорогое; 2) отделить некоторые изменения сущностей в отдельной транзакции; 3) для управления порядком фиксации к db – Mikl