Документация несколько вводит в заблуждение. В режиме неявного отслеживания все объекты имеют состояние (управляемое, удаленное, отключенное и т. Д.); объекты, полученные с помощью find()
и аналогичными методами (в основном все, что не создано с помощью new
), уже находятся в управляемом состоянии. На flush()
все управляемые (и удаленные) объекты проверяются на наличие изменений и, при необходимости, обновляются в БД.
В режиме явного отслеживания имеется дополнительный грязный контрольный список, и persist()
добавляет объект (и, возможно, связанные объекты, в зависимости от настроек каскада) в этот список. Только элементы в грязном контрольном списке рассматриваются для обновления. Грязный контрольный список очищается после очистки, поэтому, если вы выполните вторую очистку и снова измените тот же объект, вы должны вызвать persist()
еще раз. (Напротив, управляемое состояние сохраняется после сброса.)
Вы можете сами проверить детали в классе Doctrine \ ORM \ UnitOfWork ; найдите isChangeTrackingDeferredImplicit
/ isChangeTrackingDeferredExplicit
(это единственные места, где поведение отличается в зависимости от двух политик).