代码之家  ›  专栏  ›  技术社区  ›  Moeez

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

  •  0
  • Moeez  · 技术社区  · 7 年前

    我创建了一个 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 以前未保存的。

    OGP已创建($项目->MSN)

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

    通过上述函数,我试图检查传入 MSN OGP 是否创建。同样,它不应该保存任何 MSN 但事实并非如此 OGP公司 已创建。

    现在,当我试着运行这个 Create 功能一次只保存一条记录。

    我想这里面有些问题 if..... elseif 这只允许保存一个条目。但我不能肯定这一点。

    更新1

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

    如何保存收到的全部 JSON 数据输入我的 数据库 所有检查都正常吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Muhammad Omer Aslam    7 年前

    您需要添加模型初始化 $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();
    

    您正在使用 $m 在curl命令中,最好发布所有代码,以防遇到一些逻辑错误,您需要相应地调整代码,或者从 百万美元 内部 foreach公司

    除此之外,您还可以使用此扩展 Yii2-Curl 对于curl命令,它将允许您以更可读的方式更灵活地编写代码