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