猿问

在幂等情况下通过服务更新实体的最佳方式?

假设我有实体:


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

]

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


炎炎设计
浏览 104回答 1
1回答

繁星淼淼

根据当前文档:刷新操作适用于具有以下语义的托管实体:实体本身使用 SQL UPDATE 语句同步到数据库,前提是至少有一个持久性字段已更改。如果实体未更改,则不会执行任何 SQL 更新。当实体成为托管实体时(根据它们的 ORMInvalidArgumentExceptions 之一):如果实体从数据库中获取或通过 EntityManager#persist 注册为新实体,则该实体被管理所以,是的,Doctrine 会为你做出决定。
随时随地看视频慕课网APP
我要回答