0

で一括ユーザー更新を行いたいとしましょうUsersController

私のUsersController中で:

foreach ($users as $user) {
    $userService = new UserService();
    $user->updateUser($data);
}

UserService::updateUser メソッドは単にpersist()/flush()

だから私は、そのようなことをするのが良い考えであるかどうか疑問に思っています:

class UserService {
  public function setUseTransaction($flag)
  {
      $this->useTransaction = $flag;
      return $this;
  }

  public function updateUser($data)
  {
     // some data mapping

     $entityManager->persist($user);

     if ($this->useTransaction) {
       $entityManager->flush();
     }
   }

   public function commit()
   {
      $entityManager->flush();
   }
}

それから私の中で私UsersControllerはできる:

$userService = new UserService();
$userService->setUseTransaction(true);

foreach ($users as $user) {
    $userService = new UserService();
    $user->updateUser($data);
}

$userService->commit();

あなたの考えは何ですか?

4

2 に答える 2

3

サービス層の上にトランザクション管理のものを公開したくありません。おそらく、そのすべてをサービスに押し込んで、2 つのパブリック メソッド updateUser(userEntity) (暗黙的なフラッシュによる 1 回限り) と updateUsers(array-of-users) (バッチ更新用) を公開します。

おおよそのようなもの:

class UserService {

    public function updateUser(User $user){
        $this->_updateUser();
        $this->em()->flush();        
    }

    public function updateUsers(array $users){
        foreach($users as $u) $this->_updateUser($u);
        $this->em()->flush();     
    }

    private function _updateUser(User $user){
        //do stuff to $user
        $this->em()->persist($user);
    }
}

その後、後で更新を 100 個のグループにチャンクすることを決定した場合、すべての一括更新ロジックは、コントローラー内の潜在的に複数の場所ではなく、サービスに適切に組み込まれます。

于 2011-05-14T22:44:25.877 に答える
0

すべてをトランザクションでラップすると、間違いなくスピードアップします。

ただし、一括更新全体を単一のSQLクエリとして記述すると、数百倍高速になります。

于 2011-05-14T21:03:34.110 に答える