2012-03-06 15 views
2

私はdoctrineリスナーをセットアップしました。これはさまざまなデータベースアクションで起動され、ログエンティティを作成してデータベースに挿入します。doctrineリスナーに要素を挿入する

INSERT INTO vvg_logs (action, entity, foreign_id, user_id, time) VALUES (?, ?, ?, ?, ?)

Parameters: { }

どのように私はこの問題を解決することができます:私はこのクエリを参照してくださいプロファイラで

SQLSTATE[HY093]: Invalid parameter number: no parameters were bound

:私はオブジェクトを更新すると

class FOO { 
// [...] 
public function onFlush(OnFlushEventArgs $args) 
{ 
    foreach ($args->getEntityManager()->getUnitOfWork()->getScheduledEntityUpdates() as $entity) { 
       $this->createLog('edit', $entity); 
    } 
} 


private function createLog($action, $entity) 
{ 
     if ($entity instanceof Log) { 
      return; 
     } 
     $log = new Log; 
     $log->setAction($action); 
     $log->setTime(new \DateTime); 
     $log->setForeignId($entity->getId()); 
     $log->setUser($this->getUser()); 
     $t   = explode('\\', get_class($entity)); 
     $entity_class = strtolower(end($t)); 
     $log->setEntity($entity_class); 
     $this->getEntityManager()->persist($log); 
    } 
// [...] 
} 

は、私は次のエラーを取得しますか?

UPDATEここ この質問への接続私の新しいトピックです:LINK

+0

あなたがリンクしている質問が削除されているようです。あなたはこの問題をどのように解決したかについてより多くの情報を提供してください。 – cellulosa

答えて

5

onFlushが呼び出されたときに、すべての変更が既に計算されていると、あなたのエンティティを変更したり、新しいエンティティを作成する場合は、それらを更新する必要があるため。 postPersistについては

$em = $this->getEntityManager(); 
$uow = $em->getUnitOfWork(); 
$logMetadata = $em->getClassMetadata('Your\LogClass'); 
... 
$em->persist($log); 
$uow->computeChangeSet($logMetadata, $log); 

$em = $this->getEntityManager(); 
$uow = $em->getUnitOfWork(); 
$log = new Log; 
... 

$logMetadata = $em->getClassMetadata('Your\LogClass'); 
$className = $logMetadata->name; 
$persister = $this->getEntityPersister($className); 
$persister->addInsert($log); 
$uow->computeChangeSet($classMeta, $logEntry); 
$postInsertIds = $persister->executeInserts(); 

if ($postInsertIds) { 
    foreach ($postInsertIds as $id => $entity) { 
     $idField = $logMetadata->identifier[0]; 
     $logMetadata->reflFields[$idField]->setValue($entity, $id); 
     $this->addToIdentityMap($entity); 
    } 
} 
+0

完璧に動作します、ありがとう! –

+0

postPersistリスナーに新しいLogを永続化する方法はありますか?問題は、UnitOfWorkのコミットメソッドでは挿入が最初に行われるが、リスナーが起動すると挿入が終了してログが挿入されないことである。私はリスナーからコミットメソッドを呼び出そうとしましたが、それによって他のエンティティオブジェクトが2回挿入されます。私が達成したいのは、すべてが完了した後にコミットを思い出すことです。あなたが別の解決法を知っていれば、それも良いことです。 –

+1

@DavidFrankが更新されました。私はコミットメソッドを再度呼び出す必要はないと思います。 – meze

関連する問題