跳过数据库记录(如果存在)

我需要从API(TeamLeader API“旧的”)中导入记录。

我正在使用ajax请求通过API“页面”循环5次。 该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请求通过api循环5次以获取所有记录
  3. 记录被添加到数据库中,并跳过其中已经存在的具有唯一ID的记录:“ 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键“ xxx”的条目“ 6837317”重复

试图插入已经存在的值的异常。

我认为问题出在控制器上,但我无法弄清楚。 也许有人可以看到问题,谢谢!

评论