Laravel - Как использовать и обновить sh внешний API в БД с помощью Guzzle - PullRequest
2 голосов
/ 29 мая 2020

У меня есть эта модель в моем проекте Laravel -5.8:

Employee

class Employee extends Model
{
   protected $table = 'employees';

   protected $primaryKey = 'id';

   protected $fillable = [
              'staff_code',
              'first_name',
              'last_name',
              'department_id',
          ];

  public function department()
  {
     return $this->belongsTo('App\Department','department_id');
  }    

}

То есть:

App \ Employee

Также у меня есть внешний api, который поставляется в виде JSON запроса на получение.

https://api.employees.net/allemployees

Я просмотрел его с помощью запроса на получение почтальона, и у меня есть что-то вроде этого:

 {
    "ID": "1",
    "StaffCode": "STC001",
    "FirstName": "Japheth",
    "LastName": "Shalom",
    "DepartmentCode": "dep2",
 },
 {
    "ID": "2",
    "StaffCode": "STC002",
   "FirstName": "Ahitophel",
   "last_name": "Nedum",
   "DepartmentCode": "dep1",
},
{
    "ID": "3",
    "StaffCode": "STC003",
    "FirstName": "Joash",
    "FirstName": "Nathan",
    "DepartmentCode": "dep2",
 },

и так далее ... это продолжается

Я уже создал эту функцию:

 use App\Employee;
 use App\Department;

 public function index() 
 {  
    $client = new GuzzleHttp\Client();
    $res = $client->request('GET','https://api.employees.net/allemployees');
    $clientdatas = json_decode($res, true);

   ...
 }

Помимо УНИКАЛЬНЫХ id и staff_code, любое из других полей тоже может измениться из исходника.

Так как любое из полей может измениться в любой момент. Как обновить sh всю базу данных, сохранить новые данные и обновить изменения?

Спасибо

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Не знаю, сработает это или нет, но лог c можно оставить .. В другом ответе он запрашивает под al oop, что плохо!

Надеюсь, это поможет вам немного

public function index() {  
    $client = new GuzzleHttp\Client();
    $res = $client->request('GET','https://api.employees.net/allemployees');
    $clientdatas = json_decode($res->getBody()->getContents(), true);
    // create a blank array for insert
    $insert_arr = [];
    foreach($clientdatas as $clientdata) {
        $make_array = [
            'id' => $clientdata['ID'],
            'staff_code' => $clientdata['StaffCode'],
            'first_name' => $clientdata['FirstName'],
            .
            .
        ];
        array_push($insert_arr, $make_array);
        // Now the the $insert_arr will ready for insert
    }
    // Here you have to check its duplicate or not  
    $exist_in_db = Employee::all('id')->toArray(); // get the id array from db

    // do the stuff for unset the duplicate 
    $final_id = array_map(function($value) {
        return $value['id'];
    }, $team_id);
    unset($exist_in_db);
    if(count($final_id) > 0){
        foreach ($insert_arr as $key => $value) {
            if (in_array($value['id'], $final_id)) {
                unset($insert_arr[$key]);
            } else {
                array_push($final_id, $value['id']);
            }
        }
    }

    // finally insert it here
    if (count($insert_arr) > 0) {
        Employee::insert($insert_arr);    
    }
}

Сообщите мне, полезно это или нет!

0 голосов
/ 29 мая 2020

Я мог бы сделать что-то вроде этого:

use App\Employee;
use App\Department;

public function index() 
{  
      $client = new GuzzleHttp\Client();
      $res = $client->request('GET','https://api.employees.net/allemployees');
      $clientdatas = json_decode($res->getBody()->getContents(), true);

      foreach($clientdatas as $clientdata)
      {
            $employee = Employee::firstOrNew(['id' => $clientdata['ID']]);
            $employee->staff_code = $clientdata['StaffCode'];
            $employee->first_name = $clientdata['FirstName'];
            $employee->last_name = $clientdata['LastName'];
            $employee->save();
      }
}

Каждый раз, когда вы будете выполнять вызов API, создавать экземпляр модели сотрудника или получать связанную модель, если идентификатор существует. Затем назначьте новые значения и сохраните вашу модель. Таким образом, вы сможете без каких-либо сложностей создавать или обновлять модели в одном l oop.

...