Yii2如何将收到的JSON数据保存到数据库

时间:2018-05-04 13:57:02

标签: php arrays json yii2 yii2-advanced-app

我创建了一个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($本期特价货品> MSN)

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

    if($meter)
        return true;
    return false;

从上面的函数中,我试图检查传入的MSN是否已经保存。如果它已经存在于表格中,则不会保存该特定MSN,但是保存之前未保存的所有其他MSN

ogpCreated($本期特价货品> MSN)

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

    if($meter)
        return true;
    return false;

从上面的函数中,我试图检查传入的MSN是否为OGP已创建。同样,它不应保存任何MSN未创建的OGP

现在,当我尝试运行此Create函数时,它一次只保存一条记录。

我认为if..... elseif中存在一些问题,即只允许保存一个条目。但我不确定。

更新1

我试图删除检查然后保存传入的数据,但仍然只保存一条记录

如果所有检查都有效,我如何将收到的JSON数据保存到我的DB

1 个答案:

答案 0 :(得分:1)

您需要在$m=new YourModel();内的foreach循环内添加模型初始化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();

您正在使用curl命令中的$m,最好发布所有代码,因为您遇到了相应调整代码所需的一些逻辑错误,或者更改{{1}中变量的名称1}}在$m

除此之外,您可以将此扩展名Yii2-Curl用于curl命令,它将以更易读的方式为您的代码提供更大的灵活性