我有一个每60秒执行一次的php 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;
有没有发生过某人?
答案 0 :(得分:3)
在现有条目上调用EntityManager::persist()
可能会对关联产生副作用。
所以,只需删除此行并仅保留您的同花顺:
$items = $this->cliRepository->findAllUnpublished();
foreach ($items as $item) {
$item->setPublish(TRUE);
}
$this->entityManager->flush();
// ...
更多信息,look here。
修改强>
您应该使用EntityManager::merge($object)
而不是EntityManager::persist($object)
,例如:
foreach ($items as $item) {
$item->setPublish(TRUE);
$this->entityManager->merge($item);
}
如果找不到引用,这将创建一个新条目,否则这将更新现有条目。
有关merging entities的更多信息。