我正在尝试使用Symfony 3.4导入数据。我已经成功完成了任务。最后,我遇到了一些问题,但我不知道如何解决。所以,我在做什么:
从Excel文件中获取数据并将其存储在数据库中。
刷新后,我删除表,然后再次浏览excel文件并将值存储在数据库中
我刚刚看到主键正在更新。这不是问题,但是困扰我。因此,如果我添加130行,将其删除,然后再次存储,则主键将从260开始,然后从390返回,依此类推。
因此,我决定不删除表,而是将其截断。并第一次创建130行。刷新时,它会截断表,但只存储5行而不是130行,而且我找不到该bug。因此,在删除时一切正常,但是在截断时,第二次它只存储五行而不是130行。这是我的代码,如果有人看到该错误,请告诉我:
public function importMappedAttributes($mappedAttributesValues)
{
if (!$this->checkIfTableIsEmpty()) {
$this->truncateTable();
}
try{
foreach ($mappedAttributesValues as $value) {
$mappedAttributes = new MappedAttribute();
$mappedAttributes->setAkeneoAttribute($value['result_one']);
$mappedAttributes->setXmlAttribute($value['result_two']);
$mappedAttributes->setXmlPath($value['result_three']);
$mappedAttributes->setMetadata($value['result_four']);
$this->getEntityManager()->persist($mappedAttributes);
$this->getEntityManager()->flush();
}
} catch (\Exception $e){
throw new \Exception('Something went wrong!');
}
}
第一部分检查表是否为空以及是否将其截断:
private function checkIfTableIsEmpty() {
$numberOfRows = count($this->getEntityManager()->getRepository('ImportAttributesBundle:MappedAttribute')->findAll());
if ($numberOfRows > 1) {
return false;
}
return true;
}
public function truncateTable() {
$em = $this->getEntityManager();
$classMetaData = $em->getClassMetadata('ImportAttributesBundle:MappedAttribute');
$connection = $em->getConnection();
$dbPlatform = $connection->getDatabasePlatform();
try {
$connection->query('SET FOREIGN_KEY_CHECKS=0');
$q = $dbPlatform->getTruncateTableSql($classMetaData->getTableName());
$connection->executeUpdate($q);
$connection->query('SET FOREIGN_KEY_CHECKS=1');
$connection->commit();
}
catch (\Exception $e) {
$connection->rollback();
}
}
答案 0 :(得分:0)
问题在于$ this-> getEntityManager()-> flush();应该走在foreach之外。这导致了意外的行为,当我将它放在foreach之后时,一切都很好。