@antonowano
Профессиональный самоучка

Что отличает сущность вызванную Doctrine (методом find) от той которую мы сами создали?

Написал скрипт переноса пользователей из старой БД, выглядит так:
$user = new User();
$user
    ->setId($u['id'])
    ->setEmail($u['user_email'])
    ->setUsername($u['login'])
; 
$em->persist($user);
$metadata = $em->getClassMetaData(get_class($user));
$metadata->setIdGeneratorType(\Doctrine\ORM\Mapping\ClassMetadata::GENERATOR_TYPE_NONE);
$em->flush();


Работает исправно. Однако нужно добавить обновление пользователя, если он ранее был перенесен в базу.
Это не сложно сделать запросив запись методом find(); но хотелось бы удостовериться что у связки Doctrine+Symfony ничего не припасено для такого случая. Ведь тот же метод $em->persist(...); мы используем и для обновления записи.

Доп. вопрос: Если $em->flush(); вызывать не после каждого $em->persist(...);, а, например, через каждые 30 насколько изменится скорость переноса?
  • Вопрос задан
  • 447 просмотров
Решения вопроса 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Ведь тот же метод $em->persist(...); мы используем и для обновления записи.


Вообще-то нет. По умолчанию persist используется для того, что бы добавить сущность в UnitOfWork. Вызывая его доктрина начинает разбираться, нам надо просто замерджить сущность в текущий UoW или добавить ее в очередь на вставку.

Вызывать persist при обновлении не нужно вовсе, можно обойтись merge, и только если у нас используется политика отслеживания изменений deferred-explicit, но это нужно в очень редких случаях. Например когда в рамках одного запроса мы должны загрузить из базы сотню-другую сущностей а обновить одну. В этом плане данная политика отслеживания изменений сильно ускоряет работу UoW, так как мы явно указываем за какими сущностями нам следить (сложность алгоритма UoW - O(N), так что чем меньше N тем быстрее работает). Единственное НО - это сильно усложняет работу с entity manager (по хорошему em должен быть только в репозитории), и в принципе ломает красивую концепцию persistence ignorance, так что использовать ее нужно только тогда, когда есть проблемы с производительностью UoW.

через каждые 30 насколько изменится скорость переноса?

Да, это ускорит работу. Единственное что, если вы занимаетесь вставкой большого количества объектов, имеет смысл после каждого flush делать clear, отчищать unit-of-work, поскольку вставленные сущности будут крутиться в нем, и после каждого flush их количество будет увеличиваться и скорость будет падать.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы