Yii2 как сохранить полученные данные JSON в базу данных - PullRequest
0 голосов
/ 04 мая 2018

Я создал API, который возвращает мне массив данных в json

Array ( [0] => stdClass Object ( [MSN] => 002999001207 [PingDateTime] => 2018-05-04T16:33:27 [PingValue] => 22 ) [1] => stdClass Object ( [MSN] => 002999001195 [PingDateTime] => 2018-05-04T16:34:11 [PingValue] => 21 ) [2] => stdClass Object ( [MSN] => 002999001180 [PingDateTime] => 2018-05-04T14:42:40 [PingValue] => 20 ) [3] => stdClass Object ( [MSN] => 002999001157 [PingDateTime] => 2018-05-04T14:42:52 [PingValue] => 30 ) [4] => stdClass Object ( [MSN] => 002999001142 [PingDateTime] => 2018-05-04T16:37:19 [PingValue] => 13 ) [5] => stdClass Object ( [MSN] => 002999001138 [PingDateTime] => 2018-05-04T16:32:22 [PingValue] => 20 ) [6] => stdClass Object ( [MSN] => 002999001114 [PingDateTime] => 2018-05-04T16:32:52 [PingValue] => 22 )

Теперь я пытаюсь сохранить его в моем DB

    $curl = curl_init($api_url);

    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_TIMEOUT, 1000);
    curl_setopt($curl, CURLOPT_HTTPHEADER, array('Key'));

    $m->start_date_time = date('Y-m-d h:i:s');

    $curl_response = curl_exec($curl);
    $json = json_decode($curl_response);
    $record = $json->data;

    foreach ($record as $item){
        if($this->isSaved($item->MSN))
        {
            return false;
        }
        else if($this->ogpCreated($item->MSN))
        {
           $m->end_date_time = date('Y-m-d h:i:s');
           $m->meter_msn = $item->MSN;
           $m->meter_id = Meters::msnmapToid($m->meter_msn);
           $m->sub_div_code = Ogpdetail::msnTosubdiv($item->MSN);
           $m->sub_div_name = Ogpdetail::subDivToName($m->sub_div_code);
           $m->meter_ping_date_time = str_replace('T', ' ', $item->PingDateTime);
            $m->save();
        }
    }
    return $this->redirect(['index']);

В приведенном выше коде есть два условия if

isSaved ($ item-> MSN)

 $meter = MeterPing::find()->where(['meter_msn' => $msn])->one();

    if($meter)
        return true;
    return false;

Из вышеуказанной функции я пытаюсь проверить, сохранен ли входящий MSN или нет. Если он уже присутствует в таблице, он не сохранит этот конкретный MSN, но сохранит все остальные MSN, которые не были сохранены ранее.

ogpCreated ($ item-> MSN)

 $meter = Ogpdetail::find()->where(['meter_serial' => $msn])->one();

    if($meter)
        return true;
    return false;

Из вышеприведенной функции я пытаюсь проверить, создано или нет входящее MSN OGP. Опять же, он не должен сохранять никаких MSN, которые не OGP созданы.

Теперь, когда я пытаюсь запустить эту функцию Create, она сохраняет только одну запись за раз.

Я думаю, что в * 1036 есть проблема, которая позволяет сохранить только одну запись. Но я не уверен в этом.

Обновление 1

Я попытался удалить чеки, а затем сохранить входящие данные, но, тем не менее, он сохраняет только одну запись

Как мне сохранить все полученные JSON данные в моем DB со всеми работающими чеками?

1 Ответ

0 голосов
/ 04 мая 2018

Вам необходимо добавить инициализацию вашей модели $m=new YourModel(); внутри цикла foreach a внутри elseif($this->ogpCreated($item->MSN)), поэтому она сохраняет только одну запись

foreach ($record as $item){

 if($this->isSaved($item->MSN)){
        return false;
 }
 else if($this->ogpCreated($item->MSN)){
    $m= new YourModel();

Вы также используете $m в команде curl. Было бы лучше опубликовать весь код, если вы столкнетесь с некоторыми логическими ошибками, вам необходимо соответствующим образом скорректировать код или изменить имя переменной с $m внутри foreach

Помимо этого, вы можете использовать это расширение Yii2-Curl для команд curl, это позволит вам более гибко кодировать в более удобочитаемом виде

...