лучший способ обновления сущности через службу в идемпотентном случае? - PullRequest
1 голос
/ 08 марта 2020

предположим, что у меня есть сущность:

class UserEntity
{
    /**
     * @var integer
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;


    /**
     * @var string
     * @ORM\Column(type="string")
     */
    private $name;

    /**
     * @var string
     * @ORM\Column(type="string")
     */
    private $email;

// and contruct, getters and setters..

}

и в соответствующей службе:

class UserService extends BaseService
{
    public function update($id, $data)
    {
        try {
            $user= $this->fetch($id);

            if (! $user instanceof UserEntity) {
                // throw respective exception;
            }

            $user->setName($data['name']);
            $user->setEmail($data['email']);

            $this->entityManager->flush($user);

            return $user;
        } catch (Exception $e) {
            throw $e;
        } 
    }
}

, если существует такой пользователь, что:

{
    id: 1,
    name: jhon,
    email: jhon@domain.com
}

и данные, предоставляемые службе:

$id = 1;
$data = [
     'name' => jhon,
     'email => jhon@domain,com
]

тогда, каков наилучший способ избежать ненужного запроса к базе данных в этих случаях? поскольку нет необходимости вызывать метод flu sh. или Doctrine внутренне отвечает за не выполнение запроса?

1 Ответ

0 голосов
/ 08 марта 2020

В соответствии с текущими документами :

Операция flu sh применяется к управляемому объекту со следующей семантикой:

  • Сам объект синхронизируется с базой данных с помощью оператора SQL UPDATE, только если изменилось хотя бы одно постоянное поле.
  • Нет SQL Обновления выполняются, если объект не изменился.

Когда объекты становятся управляемыми (согласно одному из их ORMInvalidArgumentExceptions):

Объект управляется, если его выбирают из базы данных или регистрируют как новый через EntityManager # persist

Так что да, Doctrine примет решение за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...