原则2 - (有时)在刷新时复制相关实体

时间:2016-03-26 16:23:36

标签: php doctrine-orm duplicates flush

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

有没有发生过某人?

1 个答案:

答案 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的更多信息。