有什么方法可以知道什么时候主义有东西可以坚持下去吗


Is there any way to know when Doctrine has something to persist|flush?

我正在尝试构建一个允许插入|更新新实体的函数,但在尝试应用软件开发的DRY原则时遇到了问题,该原则旨在减少各种信息的重复。这就是我所拥有的:

foreach ($data as $row) {
        $entity = $this->_em->getRepository('PDOneBundle:Target')->findOneBy(
            array('veeva_account_id' => $row['Id'])
        );
        $lastModifiedAt = new 'DateTime($row['LastModifiedDate']);
        // Constraints
        if ($row['Id'] != null && $row['FirstName'] != null && $row['LastName']) {
            // CREATE
            if (!is_object($entity)) {
                $entity = new Entity'Target();
                $entity->setVeevaAccountId($row['Id']);
                $entity->setVeevaAccountId($row['Id']);
                $entity->setNpi($row['NPI_vod__c']);
                $entity->setFirst(ucfirst(strtolower($row['FirstName'])));
                $entity->setLast(ucfirst(strtolower($row['LastName'])));
                $entity->setTitle($row['Title__c']);
                $entity->setDisplayName(
                    ucfirst(strtolower($row['FirstName'])).' '.ucfirst(
                        strtolower($row['LastName'])
                    )
                );
                $entity->setLastSyncAt(new 'DateTime());
                // Persisting the current user
                $this->_em->persist($entity);
                // Each 1000 items persisted we flush everything
                if (($i % $this->_batchSize) === 0) {
                    echo 'Flushing batch...'."'n";
                    echo 'Memory: '.$this->getReadableSize(memory_get_usage())."'n";
                    $this->_em->flush();
                    $this->_em->clear();
                    echo 'After batch...'."'n";
                    echo 'Memory: '.$this->getReadableSize(memory_get_usage())."'n";
                }
                ++$i;
            }
            $lastSyncAt = $entity->getLastSyncAt();
            // UPDATE
            if ($lastModifiedAt > $lastSyncAt) {
                // Updating info
                $entity->setVeevaAccountId($row['Id']);
                $entity->setNpi($row['NPI_vod__c']);
                $entity->setFirst(ucfirst(strtolower($row['FirstName'])));
                $entity->setLast(ucfirst(strtolower($row['LastName'])));
                $entity->setTitle($row['Title__c']);
                $entity->setDisplayName(
                    ucfirst(strtolower($row['FirstName'])).' '.ucfirst(
                        strtolower($row['LastName'])
                    )
                );
                $entity->setLastSyncAt(new 'DateTime());
                // Persisting the current user
                $this->_em->persist($entity);
                // Each 1000 items persisted we flush everything
                if (($i % $this->_batchSize) === 0) {
                    echo 'Flushing batch...'."'n";
                    echo 'Memory: '.$this->getReadableSize(memory_get_usage())."'n";
                    $this->_em->flush();
                    $this->_em->clear();
                    echo 'After batch...'."'n";
                    echo 'Memory: '.$this->getReadableSize(memory_get_usage())."'n";
                }
                ++$i;
            }
        }
    }

正如你可能注意到的这段代码:

$this->_em->persist($entity);
// Each 1000 items persisted we flush everything
if (($i % $this->_batchSize) === 0) {
    echo 'Flushing batch...'."'n";
    echo 'Memory: '.$this->getReadableSize(memory_get_usage())."'n";
    $this->_em->flush();
    $this->_em->clear();
    echo 'After batch...'."'n";
    echo 'Memory: '.$this->getReadableSize(memory_get_usage())."'n";
}
++$i;

如果出现两次,那么我脑海中浮现的是检查Doctrine是否有东西可以坚持|flush,然后拿出代码并放在条件句下面,但我也不知道这是否可能,怎么做,所以有什么建议吗?

PS:欢迎更改代码逻辑,请随时向我提出建议,以实现同样的目标并改进我的代码

如评论中所述,您可以使用princism prePersist/preUpdate事件(文档:http://doctrine-orm.readthedocs.org/en/latest/reference/events.html)。

如果你只是想保持干燥,我也可以向你推荐这样的功能:

protected function flushBatch($em, $counter, $batchSize) {
    if (($counter % $batchSize) === 0) {
        echo 'Flushing batch...'."'n";
        echo 'Memory: '.$this->getReadableSize(memory_get_usage())."'n";
        $em->flush();
        $em->clear();
        echo 'After batch...'."'n";
        echo 'Memory: '.$this->getReadableSize(memory_get_usage())."'n";
    }
}

显然,这只是一个建议,如果你在项目的其他地方不需要逻辑。