Неопределенное смещение при вставке данных с помощью Guzzle Laravel - PullRequest
0 голосов
/ 30 сентября 2019

Я вставляю данные из стороннего API в мою базу данных с помощью Guzzle. Кажется, все хорошо, пока одно из этих полей не существует из API. Он приходит с ошибкой: «НЕОПРЕДЕЛЕННЫЙ СМЕЩЕНИЕ», так что я предполагаю, что это проблема. Это мое расписание команд:

        $client = new Client(['headers' => ['Accept' => 'application/json']]); 
        $res = $client->request('GET', 'https://example.com/api/apiKey=XXXXXXXXXXXXXXXXXXX');
        $data = json_decode($res->getBody()->getContents(),true);
        $events = $data['Data'];

        foreach($events as $item)
        {
                        DB::table('apidata')->updateOrInsert([
                'matchID'=>$item['matchID']],
                [
                'matchID'=>$item['matchID'] ?? null,
                'startTime'=>date('Y-m-d H:i', strtotime($item['startTime'])) ?? null,
                'timeLive'=>$item['timeLive'] ?? null,
                'homeTeam'=>$item['homeTeamInfo']['homeTeam'] ?? null,
                'homeGoals' =>$item['homeTeamInfo']['homeGoals'] ?? null,
                'awayGoals'=>$item['awayTeamInfo']['awayGoals'] ?? null,
                'awayTeam'=>$item['awayTeamInfo']['awayTeam'] ?? null,

Итак, каков наилучший способ избежать ошибки «НЕОПРЕДЕЛЕННЫЙ СМЕЩЕНИЕ» в случае, если API поставляется с несуществующим полем ?. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Для каждого вставляемого поля добавьте проверку, установлено оно или нет ..

DB::table('apidata')->updateOrInsert([
            'matchID'=>$item['matchID']],
            [
            'matchID'=>isset($item['matchID']) ? $item['matchID'] : '',
            'startTime'=>isset($item['startTime']) ? date('Y-m-d H:i', strtotime($item['startTime'])) : '',
            'timeLive'=>isset($item['timeLive']) ? $item['timeLive'] : '',
            'homeTeam'=>isset($item['homeTeamInfo']['homeTeam']) ? $item['homeTeamInfo']['homeTeam'] : '',
            'homeGoals' =>isset($item['homeTeamInfo']['homeGoals']) ? $item['homeTeamInfo']['homeGoals'] : '',
            'awayGoals'=>isset($item['awayTeamInfo']['awayGoals']) ? $item['awayTeamInfo']['awayGoals'] : '',
            'awayTeam'=>isset($item['awayTeamInfo']['awayTeam']) ? $item['awayTeamInfo']['awayTeam'] : '',
0 голосов
/ 30 сентября 2019

То, как вы используете элемент startTime, не учитывает значение, которое не найдено. Бит ?? null используется только после того, как вы попытаетесь преобразовать его во время, а затем в дату ...

'startTime'=>date('Y-m-d H:i', strtotime($item['startTime'])) ?? null,

В этом случае вам лучше использовать старый метод isset(). ..

'startTime'=>isset($item['startTime']) ?date('Y-m-d H:i', strtotime($item['startTime'])) 
                                        : null,

То же самое с ...

bcdiv($item['odds'][0]['regular'][0]['odds'][0]['decimalValue'],1,2) ?? null

...

isset($item['odds'][0]['regular'][0]['odds'][0]['decimalValue']) ?
       bcdiv($item['odds'][0]['regular'][0]['odds'][0]['decimalValue'],1,2) 
      : null
...