2016-03-26 4 views
0

Ich habe PHP-Arbeiter, die alle 60 Sekunden ausgeführt wird. Der Arbeiter geht durch Artikel und veröffentlicht sie.Lehre 2 - (manchmal) duplizieren verbundene Unternehmen auf flush

Ich habe Repository:

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(); 
} 

und Fassade

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; 
} 

und der Arbeiter, wo die Fassade (jede wiederum nicht)

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; 
} 

Problem ist, dass manchmal die Arbeiter aufgerufen Dupliziere verwandte Bilder in der Galerie.

Artikel:

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

Galerie:

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

Hat es jemals mit jemandem passiert?

Antwort

3

Aufruf EntityManager::persist() auf einem vorhandenen Eintrag können Nebenwirkungen auf Assoziationen hervorrufen.

So entfernen Sie diese Zeile und halten nur Ihre bündig:

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

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

$this->entityManager->flush(); 

// ... 

Weitere, look here.

EDIT

Sie EntityManager::merge($object) statt EntityManager::persist($object) verwenden soll, z:

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

Dies wird einen neuen Eintrag erstellen, wenn keine Referenz, sonst finden kann dies einen bestehenden Eintrag aktualisieren.

Mehr über merging entities.

+0

Nein, ich entfernt haben die bestehen bleiben und Problem gelöst ist nicht. Es sollte nicht von Bedeutung sein, ob Sie auf bereits existierende Entitäten fortfahren. Es ruft nur Hörer und nichts mehr. – MakoBuk

+0

Bitte schauen Sie sich meine Bearbeitung an. – chalasr

Verwandte Themen