Yii2 如何将收到的 JSON 数据保存到数据库中
Yii2 how to save received JSON data into database
我创建了一个 API
,returns 我在 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条件
已保存($item->MSN)
$meter = MeterPing::find()->where(['meter_msn' => $msn])->one();
if($meter)
return true;
return false;
从上面的函数中,我试图检查传入的 MSN
是否已经保存。如果它已经存在于 table 中,它不会保存那个特定的 MSN
但会保存所有其他以前未保存的 MSN
。
ogpCreated($item->MSN)
$meter = Ogpdetail::find()->where(['meter_serial' => $msn])->one();
if($meter)
return true;
return false;
从上面的函数中,我试图检查传入的 MSN
是否是 OGP
创建的。同样,它不应保存任何 OGP
未创建的 MSN
。
现在,当我尝试 运行 这个 Create
函数时,它一次只保存一条记录。
我认为 if..... elseif
中存在一些问题,只允许保存一个条目。但我不确定。
更新 1
我尝试删除检查然后保存传入数据,但它仍然只保存一条记录
如何将所有收到的 JSON
数据保存到我的 DB
中并且所有检查都有效?
您需要在 foreach
循环内添加模型初始化 $m=new YourModel();
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
最好 post 所有代码,以防您 运行 出现一些逻辑错误,您需要相应地调整代码,或从 foreach
中的 $m
更改变量名称
除此之外,您还可以将此扩展 Yii2-Curl
用于 curl 命令,它可以让您以更易读的方式更灵活地编写代码
我创建了一个 API
,returns 我在 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条件
已保存($item->MSN)
$meter = MeterPing::find()->where(['meter_msn' => $msn])->one();
if($meter)
return true;
return false;
从上面的函数中,我试图检查传入的 MSN
是否已经保存。如果它已经存在于 table 中,它不会保存那个特定的 MSN
但会保存所有其他以前未保存的 MSN
。
ogpCreated($item->MSN)
$meter = Ogpdetail::find()->where(['meter_serial' => $msn])->one();
if($meter)
return true;
return false;
从上面的函数中,我试图检查传入的 MSN
是否是 OGP
创建的。同样,它不应保存任何 OGP
未创建的 MSN
。
现在,当我尝试 运行 这个 Create
函数时,它一次只保存一条记录。
我认为 if..... elseif
中存在一些问题,只允许保存一个条目。但我不确定。
更新 1
我尝试删除检查然后保存传入数据,但它仍然只保存一条记录
如何将所有收到的 JSON
数据保存到我的 DB
中并且所有检查都有效?
您需要在 foreach
循环内添加模型初始化 $m=new YourModel();
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
最好 post 所有代码,以防您 运行 出现一些逻辑错误,您需要相应地调整代码,或从 foreach
$m
更改变量名称
除此之外,您还可以将此扩展 Yii2-Curl
用于 curl 命令,它可以让您以更易读的方式更灵活地编写代码