在幂等情况下,通过服务更新实体的最佳方式是什么



假设我有实体:

class UserEntity
{
/**
* @var integer
* @ORMId
* @ORMColumn(type="integer")
* @ORMGeneratedValue(strategy="IDENTITY")
*/
private $id;

/**
* @var string
* @ORMColumn(type="string")
*/
private $name;
/**
* @var string
* @ORMColumn(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
]

那么,在这种情况下,避免对数据库进行内部查询的最佳方法是什么?因为没有必要调用flush方法。或者Doctrine内部负责不进行查询?

根据当前文档:

刷新操作应用于具有以下语义的托管实体:

  • 实体本身使用SQL UPDATE同步到数据库语句,前提是至少有一个持久字段已更改
  • 无SQL如果实体没有改变,则执行更新

当实体被管理时(根据其ORMInvalidArgumentException之一(:

如果实体从数据库中提取或通过EntityManager#persistent 注册为新实体,则对其进行管理

所以是的,Doctrine会为你做出决定。

相关内容

  • 没有找到相关文章

最新更新