假设我有实体:
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会为你做出决定。