我有一个php worker,它每60秒执行一次。worker遍历文章并发布它们。
我有仓库:
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;
这种事发生在某人身上了吗?
对现有条目调用EntityManager::persist()
可能会对关联产生副作用。
所以,只要去掉这条线,只保留你的冲洗:
$items = $this->cliRepository->findAllUnpublished();
foreach ($items as $item) {
$item->setPublish(TRUE);
}
$this->entityManager->flush();
// ...
有关更多信息,请查看此处。
编辑
您应该使用EntityManager::merge($object)
而不是EntityManager::persist($object)
,例如:
foreach ($items as $item) {
$item->setPublish(TRUE);
$this->entityManager->merge($item);
}
如果找不到引用,这将创建一个新条目,否则将更新现有条目。
有关合并实体的详细信息。