Мне нужно импортировать записи из API (TeamLeader API 'old one').
Я использую запрос ajax для l oop 5 раз через "страницы" API. В API имеется около 400 записей, и ограничение на количество запросов одновременно составляет 100.
Ajax Запрос:
<button id="ajax" type="button" class="btn btn-primary ajax" title="Ajax Request">
Import
</button>
<div class="card-body">
<div class="ajax-content"></div>
</div>
<script type="text/javascript">
$('#ajax').click(function () {
$('.ajax-content').html('');
getAjax(0);
});
var cur = 0;
function getAjax(cur) {
$.ajax({
url: 'import/'+cur, success: function (result) {
if(result == 0 && cur < 9)
{
getAjax(cur+1)
}else{
$('.ajax-content').html('<hr>Import finished. Records : ' + result)
}
}
})
}
</script>
Затем у меня есть контроллер для добавления записей в базу данных. Идея состоит в том, чтобы добавить все записи в базу данных и пропустить записи, которые уже находятся там.
Пытаясь изо всех сил объяснить идею всего этого:
- Итак, вы импортируете записи
- Запрос ajax проходит 5 раз по интерфейсу API, чтобы получить все записи
- Записи добавляются в базу данных и пропускают уже существующие записи с уникальным идентификатором. : 'TlId'
Контроллер:
/**
* @Route("/import/{page}", name="import_company")
*/
public function importCompany($page, LoggerInterface $logger, CompanyRepository $companyRepository): Response
{
$fields = array(
"api_group" => ("XXXXX"),
"api_secret" => ("XXXXX"),
"amount" => ("100"),
"pageno" => ($page),
);
$client = HttpClient::create();
$response = $client->request('POST', "https://app.teamleader.eu/api/getCompanies.php", [
'body' => $fields,
]);
$content = $response->getContent();
$results = json_decode($content, true);
$id = $companyRepository->findAllByTlId();
$ids = array_column($id, "TlId");
$number = 0;
foreach ($results as $item) {
if (!in_array($item['id'], $ids)) {
$number ++;
$company = new Company();
$company
->setTlId($item['id'])
->setName($item['name'])
->setWebsite($item['website'])
->setType(null)
->setBillingAddress($item['street']. ' ' . $item['number'])
->setBillingZip($item['zipcode'])
->setBillingTown($item['city'])
->setEmail($item['email'])
->setPhone($item['telephone'])
->setFax($item['fax']);
$this->em->persist($company);
}
$this->em->flush();
return new Response($number);
}
Итак, проблема в том, что ajax повторяется 1 раз и получает 1 запись. после этого он останавливается и показывает количество записей, которые он получил «1».
Если я попробую еще раз, это исключение и ошибка:
SQLSTATE [23000]: ограничение целостности нарушение: 1062 Повторяющаяся запись '6837317' для ключа 'xxx'
И исключение, которое пыталось вставить уже существующие значения.
Я думаю, что проблема в де контроллер, но я не могу понять это. Может быть, кто-то может увидеть проблему, спасибо!