Короткий и простой вопрос:
Как определить, что Doctrine PHP Entity
Объект новый?
новый — Я имею в виду не в базе данных и не «обновление» действия.
Самое главное — мне нужен способ проверить это без каких-либо запросов, таких как:
$manager->findOne($something);
На самом деле иногда я пытался проверить, является ли идентификатор пустым, но я не на 100% уверен, что этот метод действителен или нет. И другой совет или, возможно, суть этого вопроса — я видел что-то вроде:
$manager->getUnitOfWork()->isInIdentityMap($object);
Выглядит хорошо, но я не могу найти то, что на самом деле работают isInIdentityMap
,
Это правда, если он был сохранен или удален? Когда эта функция скажет true и false?
//EDIT
Мне нужно обнаружить созданный объект первый раз — существует только в php, но не в базе данных. Конечно, сущность, загруженная из базы данных для применения обновлений, не нова для меня, например:
Когда вы создаете Comment
объект, который вам нужно увеличить commentCounter
но его следует увеличивать только при первом сбросе этого комментария.
Вы не хотите увеличивать его при обновлении или удалении существующего комментария.
Как проверить, что комментарий новый и счетчик должен быть увеличен.
Пожалуйста, объясните в ответах, почему ваш метод хорош / лучше
Ты можешь использовать
$entityManager->contains($entity)
Редактировать:
Исходя из ваших правок, я предлагаю использовать прослушиватель сущностей:
http://doctrine-orm.readthedocs.io/en/latest/reference/events.html#entity-listeners
Поэтому вам не нужно проверять, является ли сущность новой или нет во многих частях вашего приложения, когда сущность сохраняется, вы только настраиваете прослушиватель сущности, и он работает везде, где вы создаете и сохраняете сущности.
Я проверил некоторые документы и проверил некоторые вещи, и я надеюсь, что все, что я пишу, правильно:
метод isInIdentityMap
$manager->getUnitOfWork()->isInIdentityMap($object);
вероятно, идеально подходит для моего случая, потому что он проверяет, что мой объект существует в Identity Map, эта карта хранит только сброшенные объекты или фактически объект с ID
, Новый объект до сохранения и после сохранения действия NULL
ID, так что его нет на этой карте. Таким образом, пока объект не был сброшен в базу данных, этот метод должен работать. (Карта содержит только объекты, загруженные из базы данных)
Способ проверки NULL
Я БЫ
if($obj->getId() == null){
//code
}
должен работать тоже, это очень похоже на первый метид, но я не уверен на 100%, что он всегда работает так, как я хочу, и, кроме того, у нас есть первый метод, так что … лучше использовать функцию, подготовленную для него.
метод contains
$entityManager->contains($entity)
Делай работу, но для другого случая. Этот метод проверяет объекты в диспетчере объектов, но любой сохраненный объект, запланированный для любого действия, уже отслеживается entityManager
, Эта функция может помочь только до тех пор, пока объект не сохраняется.
Другие методы
У единицы работы есть много других методов, Я не проверял их все, но, кажется, мы можем легко проверить многие другие, используя такие функции, как:
->scheduleForInsert();
->scheduleForUpdate();
// etc
И другой случай — использование Учение о событиях событие:
prePersist
prePersist — Событие prePersist происходит для данного объекта до того, как соответствующая операция сохранения EntityManager для этого объекта будет выполнена. Следует отметить, что это событие вызывается только при первоначальном сохранении объекта (т.е. оно не срабатывает при будущих обновлениях).