Также не забывайте, что метод flush фактически обновляет ваши изменения в базе данных. Это означает, что если вам нужно сохранить более одного объекта, лучше сделать один сброс в конце каждой сохраняемой операции.
Скажем, у вас есть три сущности: $entity1
, $entity2
и $entity3
. Тогда этот код не является оптимальным:
$em->persist($entity1);
$em->flush();
$em->persist($entity2);
$em->flush();
$em->persist($entity3);
$em->flush();
Этот код будет работать лучше, потому что он синхронизирует вашу базу данных только один раз:
$em->persist($entity1);
$em->persist($entity2);
$em->persist($entity3);
$em->flush();
Таким образом, наличие ярлыка в вашем контроллере, такого как persistAndFlush
, должно использоваться с осторожностью, потому что оно неэффективно, когда вам нужно сохранить более одного объекта. Об этом говорится здесь в документации Doctrine2 (на 3/4 страницы). Вот текст взятый из официальной документации 2.0:
Не вызывайте flush после каждого изменения объекта или каждого отдельного вызова persist / remove / merge / ... Это анти-шаблон и излишне снижает производительность вашего приложения. Вместо этого формируйте единицы работы, которые работают с вашими объектами, и вызывайте flush, когда вы закончите. При обслуживании одного HTTP-запроса обычно не нужно вызывать сброс более 0-2 раз.
С уважением,
Matt