Вызов Doctrine clear () с аргументом устарел - PullRequest
0 голосов
/ 29 января 2020

Doctrine сообщает, что -

Вызов Doctrine \ ORM \ EntityManager :: clear () с любыми аргументами для очистки указанных c сущностей устарел, поскольку doctrine / persistence 1.3 и будет удален в 2.0.

У нас много ссылок на ->clear(SpecificEntity::class) в нашей Symfony кодовой базе, и мы хотим обновить их, но мы изо всех сил пытаемся найти предлагаемую замену в последней руководство по обновлению .

Есть ли рекомендуемая альтернатива для очистки указанного c объекта в последней версии Doctrine?

1 Ответ

2 голосов
/ 29 января 2020

Вызов clear($entity) имеет некоторые побочные эффекты и неясное поведение, например, что происходит с отношениями в / с этой сущностью? Идея состоит в том, что ваша единица работы (изменения в памяти, которые Doctrine отслеживает до тех пор, пока вы не нажмете грипп sh) должна быть небольшой и содержать только объекты, которые вы хотите изменить, чтобы избежать неопределенности в отношении того, что сохраняется / очищено. Вместо того, чтобы вынимать сущность, она не должна быть там во-первых. Вместо этого он может, например, получить свой собственный грипп sh - «цикл», за которым следует очистка всей единицы работы, чтобы показать, что эти изменения не зависят от других.

Есть несколько способов сделать это, чаще всего (я думаю):

Используйте clear() (без указания c сущности) чаще.

Это, вероятно, требует от вас все изменения в сущностях тесно сгруппированы, чтобы исключить случайные записи в другие сущности. Скорее всего, вам также придется чаще перечитывать данные. Чтобы компенсировать это, вы должны использовать кэш второго уровня.

Использование другой политики отслеживания изменений

По умолчанию все изменения неявно отслеживаются, а затем сохраняются. Вместо этого вы можете указать Doctrine писать только явные изменения. Это означает, что, например, если у вас есть пользователь с большим количеством адресов и вы звоните только persist($user), соответствующие изменения адреса не будут сохранены. Вместо этого вам нужно вручную вызывать постоянный на каждом адресе, который должен быть сохранен. Вам не нужно вызывать clear как часто, потому что вы явно говорите, какие изменения сущностей должны быть сохранены.


Оба варианта требуют реорганизации бизнес-логики c, что делает ее действительно трудной дать общее руководство по обновлению для этого. Вообще говоря, причины и решения очень похожи на то, что описано для flush($entity), который получил свой раздел в документации: https://github.com/doctrine/orm/blob/master/UPGRADE.md#bc -break-remove-entitymanagerflushentity-and-entitymanagerflushentities

...