Как doctrine обрабатывает неизменное поле при обновлении уже существующего объекта - PullRequest
0 голосов
/ 19 февраля 2020

Предположим, у меня есть сущность, сопоставленная с таблицей базы данных MariaDB со следующими полями: ID, firstName и lastName.
Эта сущность была загружена из базы данных в объекте PHP и я выполняю следующий код

/**
 * $myEntity is the entity and $em is the entity manager
 * $myEntity->getFirstName(); Would be John
 * $myEntity->getLastName(); Would be Doe
 */

$myEntity->setFirstName("Bob");

$em->persist($myEntity);
$em->flush();

В результате вы получите следующий запрос:

UPDATE `table`SET `firstName` = 'Bob' WHERE `ID`= "x"

Или следующий запрос:

UPDATE `table` SET `firstName` = 'Bob', SET `lastName` = 'Doe' WHERE `ID` = 'x'

В общем: как Doctrine обрабатывает неизмененные поля, и что считается "неизмененным"? То же значение, без присвоения переменной, что-то еще?
Я искал в документации Doctrine и в Google, но ничего не нашел по этому вопросу.

Я спрашиваю, потому что у меня есть объект, который, очевидно, больше, чем тот, что в примере (35 столбцов, включая 2 TEXT столбцов), и часто только один или два столбца обновляются одновременно.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

@ Ответ Джошуа Рапосы был верным, но, похоже, он был извлечен из воздуха. Я провел свои собственные тесты, включив вход в базу данных.

Выполненный код

/**
 * $myEntity is the entity and $em is the entity manager
 * $myEntity->getFirstName(); Would be John
 * $myEntity->getLastName(); Would be Doe
 */

$myEntity->setFirstName("Bob");
$myEntity->setLastName("Doe"); // Setting the last name to the same value as it currently is
$em->persist($myEntity);
$em->flush();

Результирующий запрос

UPDATE `table`SET `firstName` = 'Bob' WHERE `ID`= "x"

Заключение

  • Doctrine обновляет только измененные столбцы до их новых значений без включая неизмененные столбцы в запросе
  • Установка для столбца того же значения, которое было раньше, не определяется как изменение значения на Doctrine, что означает, что вы можете каждый раз устанавливать все столбцы, что значительно упрощает код.
0 голосов
/ 19 февраля 2020

Doctrine только обновляет то, что действительно изменилось, поэтому ваш первый сценарий произойдет.

...