原则2——(有时)在同花顺上重复相关实体


Doctrine 2 - (sometimes) duplicate related entities on flush

我有一个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);
}

如果找不到引用,这将创建一个新条目,否则将更新现有条目。

有关合并实体的详细信息。