2016-03-26 11 views
0

私は60秒ごとに実行されるPHPワーカーを持っています。労働者は記事を通ってそれらを公開する。Doctrine 2 - (時々)フラッシュ時に関連するエンティティを複製します

私はリポジトリがあります

public function findAllUnpublished() 
{ 
    $query = $this->entityManager->createQuery('SELECT i FROM Extra\Item\Item i 
      WHERE i.status = :status') 
      ->setParameter('status', ItemStatusEnum::UNPUBLISHED); 
    return $query->getResult(); 
} 

とファサード

public function publishUnpublished() 
{ 
    $items = $this->cliRepository->findAllUnpublished(); 
    foreach ($items as $item) { 
     $item->setPublish(TRUE); 
     $this->entityManager->persist($item); 
    } 
    $this->entityManager->flush(); 
    $this->itemChangedObserver->notifyBatchPublished($items); // this clear cache on web server 
    return $items; 
} 

をし、ファサードと呼ばれている労働者は

public function execute() 
{ 
    $this->logger->logMessage(ILogger::DEBUG, 'Start publising'); 

    $items = $this->itemFacade->publishUnpublished(); 
    $itemsIds = array_map(function ($item) { 
     return $item->getId(); 
    }, $items); 
    $this->logger->logMessage(
     ILogger::DEBUG, 
     'Published %d items (%s)', 
     count($items), 
     implode(', ', $itemsIds) 
    ); 

    $this->logger->logMessage(ILogger::DEBUG, 'End publising'); 

    return IJob::OK; 
} 

問題が時々(ない毎ターン)ということである労働者関連する画像をギャラリーに複製します。

記事:

/** 
* @var \Doctrine\Common\Collections\Collection 
* 
* @OneToMany(targetEntity="gallery", mappedBy="article", cascade={"persist", "remove"}) 
* @OrderBy({"position" = "ASC"}) 
* 
*/ 
private $gallery; 

ギャラリー:

/** 
* @var \Article 
* 
* @ManyToOne(targetEntity="Article", inversedBy="gallery") 
*/ 
private $article; 

が、それが今まで誰かに起こったことがありますか?

答えて

3

既存のエントリにEntityManager::persist()を呼び出すと、関連付けに副作用が発生する可能性があります。

それでは、この行を削除して、あなただけのフラッシュを保つ:look here、より多くの場合

$items = $this->cliRepository->findAllUnpublished(); 

foreach ($items as $item) { 
    $item->setPublish(TRUE); 
} 

$this->entityManager->flush(); 

// ... 

を。

例えばあなたがEntityManager::persist($object)ではなくEntityManager::merge($object)を使用する必要があります

EDIT:

foreach ($items as $item) { 
    $item->setPublish(TRUE); 
    $this->entityManager->merge($item); 
} 

何の言及が見つからない場合、これは新しいエントリを作成しますが、そうでない場合、これは既存のエントリを更新します。

詳細merging entitiesについて

+0

いいえ私は持続性を取り除き、問題は解決しません。既存のエンティティでpersistを呼び出すかどうかは関係ありません。それはリスナーだけを呼び出すだけです。 – MakoBuk

+0

私の編集を見てください。 – chalasr

関連する問題