Короткий и простой вопрос:

Как определить, что объект Doctrine PHP Entity новый?

Новое - я имею в виду, что его нет в базе данных, и это не действие "обновление". Самое главное - мне нужен способ проверить это без каких-либо запросов, например:

$manager->findOne($something);

На самом деле, иногда я пытался проверить, является ли идентификатор нулевым, но я не уверен на 100%, что этот метод действителен или нет. И другой совет или, вероятно, суть этого вопроса - я видел что-то вроде:

$manager->getUnitOfWork()->isInIdentityMap($object);

Выглядит неплохо, но я не могу найти, что на самом деле выполняет функция isInIdentityMap. Это правда, если он был сохранен или удален? Когда эта функция говорит истину и ложь?


//EDIT

Мне нужно обнаружить объект сущности, созданный впервые - существующий только в php, но не в базе данных. Конечно, сущность, загруженная из базы данных для применения обновлений, для меня не нова - например:

Когда вы создаете объект Comment, вам нужно увеличивать commentCounter, но он должен увеличиваться только тогда, когда вы очищаете этот комментарий в первый раз. Вы не хотите увеличивать его при обновлении или удалении существующего комментария. Как проверить, что комментарий новый и счетчик должен быть увеличен.

Пожалуйста, объясните в ответах, почему ваш метод хорош / лучше

1
Griva 22 Дек 2016 в 05:33
1
Часто бывает проще посмотреть на сам код, чтобы увидеть, что происходит. В частности, может помочь unitOfWork-> isScheduledForInsert ($ entity).
 – 
Cerad
22 Дек 2016 в 06:29
Какой у вас вариант использования? Чего вы пытаетесь достичь? Самый простой и «безопасный» способ - использовать События.
 – 
Boris Guéry
22 Дек 2016 в 12:54
Вопрос обновлен - на самом деле мне нужно увеличить счетчик для сбора, но только если вы добавляете новый объект.
 – 
Griva
22 Дек 2016 в 18:57

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 для этой сущности. Следует отметить, что это событие запускается только при первоначальном сохранении объекта (т.е. оно не запускается при будущих обновлениях).

2
Griva 27 Дек 2016 в 21:49

Ты можешь использовать

$entityManager->contains($entity)

Редактировать: На основе вашего редактирования я предлагаю использовать прослушиватель сущностей: http://doctrine-orm.readthedocs.io/ ru / latest / reference / events.html # entity-listeners. Таким образом, вам не нужно проверять, является ли сущность новой или нет во многих частях вашего приложения, когда сущность сохраняется, вы только настраиваете прослушиватель сущностей, и он работает везде, где вы создаете и сохраняете сущности.

4
Pipe 22 Дек 2016 в 21:56
Как знание того, что объект управляется, применимо к вопросу?
 – 
Cerad
22 Дек 2016 в 06:25
Если ваша сущность новая , то объект неизвестен для entityManager. если ваша сущность не новая , то entityManager знает об этом, если вы ранее не отсоединили эту сущность от entityManager.
 – 
Pipe
22 Дек 2016 в 06:39
Или вы его сохранили, еще не смыв. Вопрос не совсем ясный.
 – 
Cerad
22 Дек 2016 в 17:11
Да, это может быть действительным или нет, в зависимости от варианта использования.
 – 
Pipe
22 Дек 2016 в 17:32
Я добавил больше деталей к вопросу. Я спрашиваю, потому что хочу прояснить все в этой теме - зачем это использовать, зачем использовать это и когда и т. Д. Мне нужен более подробный ответ, чтобы увидеть разницу в этих методах.
 – 
Griva
22 Дек 2016 в 19:03