Пропустить запись базы данных, если существует - PullRequest
0 голосов
/ 07 февраля 2020

Мне нужно импортировать записи из 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>

Затем у меня есть контроллер для добавления записей в базу данных. Идея состоит в том, чтобы добавить все записи в базу данных и пропустить записи, которые уже находятся там.

Пытаясь изо всех сил объяснить идею всего этого:

  1. Итак, вы импортируете записи
  2. Запрос ajax проходит 5 раз по интерфейсу API, чтобы получить все записи
  3. Записи добавляются в базу данных и пропускают уже существующие записи с уникальным идентификатором. : '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'

И исключение, которое пыталось вставить уже существующие значения.

Я думаю, что проблема в де контроллер, но я не могу понять это. Может быть, кто-то может увидеть проблему, спасибо!

1 Ответ

1 голос
/ 07 февраля 2020

AJAX зацикливается один раз, потому что вы возвращаетесь внутрь foreach l oop. Это приводит к тому, что в базу данных вставляется только одна строка.

Переместите эту строку за пределы foreach l oop:

return new Response($number);

И это должно решить проблему только с одной строка добавляется.

При ошибке SQL вы добавляете новые строки, не проверяя, существует ли уже уникальное значение столбца. Вы должны разработать некоторую форму проверки уникальной строки, как упомянуто @Zeljka в обсуждении ниже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...