Я хочу импортировать ExcelSheet в мою БД с помощью Symfony / Doctrine (импортированный пакет импорта данных ddeboer)
Как лучше импортировать данные и сначала проверить, импортированы ли уже данные?
Я думал о двух возможностях:
1)
$numarray = $repo->findAllAccounts();
$import = true;
foreach ($reader as $readerobjectkey => $readervalue) {
foreach ($numarray as $numkey){
if (($numkey->getNum() == $readervalue['number'])){
$import = false;
}
}
if($import){
$doctrineWriter ->disableTruncate()
->prepare()
->writeItem(
array(
'num' => $readervalue['number'],
'name' => $readervalue['name'],
'company' => $companyid
)
)
->finish();
2)
foreach ($reader as $row =>$value ) {
// check if already imported
$check = $this->checkIfExists($repo,'num', $value['number']);
if ($check){
echo $value['number']." Exists <br>";
}else{echo $value['number']." new Imported <br>";$doctrineWriter ->disableTruncate()
->prepare()
->writeItem(
array(
'num' => $value['number'],
'name' => $value['name'],
'company' => $companyid
)
)
->finish();public function checkIfExists($repo, $field, $value){
$check = $repo->findOneBy(array($field => $value));
return $check;
Проблема в том, что с большими документами (3000 строк +) с обоими решениями я получаю тайм-аут ….
Ошибка: превышено максимальное время выполнения 30 секунд
в общем: для проблем с производительностью: предпочтительно генерировать 1000 запросов, чтобы проверить, существует ли значение (findOneBy) или использовать два цикла foreach для сравнения значений?
Любая помощь будет потрясающей!
Спасибо заранее …
Вы можете попробовать проверить filemtime файла: http://php.net/manual/en/function.filemtime.php
Я не уверен, что он будет работать должным образом, но стоит попробовать, чтобы посмотреть, работает ли измененная дата, как ожидалось.
В противном случае вам следует подумать о другом способе проверки данных таким образом, что для этого потребуется много ресурсов. возможно добавление метаданных в файл Excel:
http://docs.typo3.org/typo3cms/extensions/phpexcel_library/1.7.4/manual.html#_Toc237519906
Лучше использовать любой другой способ, чем циклический или запрос к базе данных для больших данных.
Других решений пока нет …