«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2020/09/06 17:55:58  №1799030 1
Что меняется после persist до первого flush?
Ответы: >>1799089
Аноним 2020/09/06 19:28:43  №1799089 2
>>1799030

Вопрос с собеседования?

persist передает новую сущность под управление EntityManager (до этого он о ней не "знает"), она добавляется в Identity Map. У EM в Identity Map хранится список всех сущностей, о которых он знает. Если сущность загружается из БД, то EM о ней "знает" и вызывать persist не надо.

По flush() он проходится по списку, сравнивает поля каждой сущности с ранее сохраненной копией и определяет, какие поля изменились. На основе этих данных он генерирует SQL-запросы INSERT/UPDATE и выполняет их.
Ответы: >>1799096
Аноним 2020/09/06 19:39:37  №1799096 3
1599421192064.png (50, 847x353)
353x847
>>1799089
Спасибо что расписал. Не с собеседования, я просто очень любопытный. Начал читать пикрил про транзакции в доктрине и не понял, почему обычный persist()-flush() назвали неявной транзакцией, отсюда появилась мысль что там под капотом происходит что-то более интересное.
Ответы: >>1799111
Аноним 2020/09/06 19:55:46  №1799111 4
>>1799096

flush() делает begin/commit, потому это называют "неявной" расстановкой границ транзакций. То есть ты явно не указываешь сделать транзакцию, а он сам ее делает.

Явное разделение транзакций - это когда ты сам в коде расставляешь beginTransaction/commit. Например, ты можешь захотеть кроме flush() внести еще какие-то изменения в рамках одной транзакции.

persist тут не при чем.