3

カスタムentityRepositoryクラスでentityRepositoryのfindメソッドを呼び出すときに、次の致命的なエラーが発生します

致命的なエラー:キャッチされない例外'Doctrine \ ORM \OptimisticLockException'とメッセージ'C:\ Users \ user \ Desktop \ projects \ Interview \ application \ libraries \ Doctrine \ ORM\OptimisticLockExceptionのバージョン管理されていないエンティティEntities\Commentのオプティミスティックロックを取得できません。 php:62スタックトレース:#0 C:\ Users \ user \ Desktop \ projects \ Interview \ application \ libraries \ Doctrine \ ORM \ EntityRepository.php(140):Doctrine \ ORM \ OptimisticLockException :: notVersioned('Entities\Commen。 ..')#1 C:\ Users \ user \ Desktop \ projects \ Interview \ application \ models \ Repositorys \ CommentRepository.php(24):Doctrine \ ORM \ EntityRepository-> find(' Entities \ Commen ...'、 1)#2 C:\ Users \ user \ Desktop \ projects \ Interview \ application \ controllers \ CommentController.php(65):Repositories \ CommentRepository-> activateByIds(Array)#3 [内部関数]:CommentController->approveComments()#4 C:\ Users \ user \ Desktop \ projects \ Interview \ system \ core \ CodeIgniter.php(359):call_user_func_array(Array、Array)#5 C:\ Users \ user \ Desktop \ projects \ Interview \ index.php(203):C:\ Users \ user \ Desktop \ projects \ Interview \ application \ libraries \ Doctrine \ ORM \OptimisticLockException.phpオンラインのrequire_once('C:\ Users \ user \ D ...') 62

これが私がfindを呼び出すメソッドです

public function activateByIds($arrayOfIds){
        if (count($arrayOfIds)>=1) {
            for ($i=0; $i<count($arrayOfIds); $i++){
                $comment = parent::find('Entities\Comment', $arrayOfIds[$i]);
                $comment->setIsactive(1);
                $this->_em->merge($comment);
                $this->_em->flush();
            }
            return true;
        }
        else return false;
    }

私は何を間違っているのですか?

4

1 に答える 1

0

私が読んだものからあなたはOptimisticLockException

このドキュメントで述べたように:

バージョンフィールドを介したオプティミスティックロックを使用するオブジェクトのバージョンチェックが失敗すると、OptimisticLockExceptionがスローされます。

オプティミスティックロックの詳細については、こちらをご覧ください

私の推測では、それらは$comment変数との競合です。

  1. 初めて$commentを初期化するとき($ i = 0)comment#1がロードされます
  2. 2回目(i = 1、コメント#2が見つかりましたが、コメントはすでにエンティティであり、管理されています)$ comment = ...コメント#1にコメント#2の値を与えようとします。競合を引き起こしています。

代わりにこれを試してください:

public function activateByIds($arrayOfIds){
        $comments =array();

        if (count($arrayOfIds)>=1) {
            foreach($arrayOfIds as $i=>$id){

                $comments [$i] = $this->getEntityManager()->find('Entities\Comment', $id); //new comment, not the old one!
                $comments [$i]->setIsactive(1);
                $this->_em->merge($comments[$i]);
                $this->_em->flush();

            }
            return true;
        }
        else return false;
      unset ($comments);
    }

そうすれば、新しいコメントの代わりに前のコメントを再利用しようとしていないことが確実になります。

于 2013-03-05T02:44:33.457 に答える