[PROMOÇÃO] Assine com + 30% de desconto ANUAL MENSAL (últimas horas)
Marcos Birro Calixto
Criador Marcos Birro Calixto 03/01/2020

Carlos, bom dia. 

Abri outro ticket sobre o guzzle/API

Bom, eu estava fazendo a requisição assim em json:

        $result = $aae->request('POST'env('URL_API_OI_V1_GETPREV'), [
            'form_params' => [
                'ano_data_programada' => 2019,
                'mes_data_programada' => 12,
            ],
            'headers' => [
                'Authorization' => "Bearer {$this->token}",
               //'Content-Type' =>  'Application/json',
                'Content-Type'  => 'application/x-www-form-urlencoded',
            ],
        ]);
 
Estava retorno em json mas no caso deste cliente OI o header content´type deve ser application/x-www...
Assim, o retorn ficou assim:
        //$preventivas = json_decode($result->getBody());
        $preventivas = urldecode($result->getBody());
        
        dd($preventivas);
Em vez de json me traz o urldecode que fica assim no dd($preventivas)
 
Criador Marcos Birro Calixto 03/01/2020

Cotinuando porque não coube:

"{"mensagem":"Ok","dados":[{"preventiva_id":155226,"status":"Em an\u00e1lise pelo fornecedor","predio":"ACAA-ACAA","UF":"MG","preventiva_tipo":"Limpeza","checklist_id":null,"data_programada":"2019-12-01","ciclo":20,"periodicidade":"SEMESTRAL","ultima_preventiva":null,"justificativa":null},{"preventiva_id":155230,"status":"Em an\u00e1lise pelo ...

Agora preciso pegar estes dados e gravar numa tabela com estes campos.
NÃo estou sabendo fazer isto. Como pego cada variável e dou um insert?

Obrigado.

Se quiser olhar, o código está em https://github.com/marcosbirrocalixto/helper/invitations
Marcos Birro Calixto
Manager Carlos Ferreira 03/01/2020

Olá, Marcos!
Tudo bem?

Primeiro passo é converte esses dados para JSON, atualmente é uma string:
$json = json_encode($preventivas);

Agora debug novamente e veja que tem os dados formatados:
dd($json);

Observe que retorna um array, porntato você pode interar em um loop para conseguir inserir:
foreach ($json['dados'] as $dado) {
    // Insere aqui...
    dd($dado);
}

Carlos Ferreira
Criador Marcos Birro Calixto 03/01/2020

Carlos, eu estou tendi dificuldades com isto! Olha o erro que está dando!

  1. //$preventivas = json_decode($result->getBody());
  2. $preventivas = urldecode($result->getBody());
  3.  
  4. $preventivasjson = json_decode($preventivas);
  5. //dd($preventivasjson);
  6.  
  7. foreach ($preventivasjson['dados'] as $dado) {
  8. // Insere aqui...
  9. dd($dado->preventiva_id);
  10. }
  11. return view('api.ssp.preventivas.index', compact('preventivasjson'));
  12. }
  13.  
  14. /**
  15. * Show the form for creating a new resource.
  16. *
  17. * @return \Illuminate\Http\Response
  18. */
  19. public function create()
  20. {
  21. //
  22. }
  23.  
  24. /**
  25. * Store a newly created resource in storage.
  26. *
Arguments
  1. "Cannot use object of type stdClass as array"
Marcos Birro Calixto
Manager Carlos Ferreira 03/01/2020

Olá, Marcos!

Por que usou o urldecode ao invés do json_decode?

Esse erro é porque você está tentando acessar o objeto (stdClass) como se fosse um array, deve ser assim (dentro do loop):
 dd($preventivasjson->dados);

 Se tiver em dúvida, verifique o tipo:
 https://www.php.net/manual/pt_BR/function.gettype.php

Carlos Ferreira
Criador Marcos Birro Calixto 03/01/2020

Esrq API é de um cliente e tenho que obedecer a documentação. Eles usam este urldecode para retornar a API deeles.

Agora tenho que pegar estes dados e inserir numa tabela.

Obrigado.

Marcos Birro Calixto
Manager Carlos Ferreira 03/01/2020

Mas, fazendo assim deu certo?
dd($preventivasjson->dados);

O que tem nessa variável mesmo?
dd($preventivasjson);

Qual é o tipo de dado?
dd(gettype($preventivasjson));

Carlos Ferreira
Criador Marcos Birro Calixto 03/01/2020

Bom dia.

dd($preventivasjson->dados) deu certo sim.

Agora vou criar a tabela e gravar estes dados que peguei do cliente. Vou fazer uma rotina para inserir caso não existe e update casoo exista.

Esta rotina rodará como cron para buscar as OSs e atualizá-las.

O retorno de dd(gettype($preventivasjson)); é "object"

Fiz o foreach e gerou a view como teste. Agora é fazer o forwach para inserir ou atualizar a tabela.

Este sistema está fcando muito grande. Além do laravel, tem o ACL, API para conectar ao aplicativo kotlin e API ara comenectar ao cliente OI. Vai rodar no país inteiro. Tenho muito que fazer... Otimizar código, reescrever algumas rotinas mas está indo.

Muito obrgado Carlos.

Marcos Birro Calixto
Criador Marcos Birro Calixto 03/01/2020

Boa tarde Carlos.

Como posso fazer este insert? Eu não lembro de ter alguma aula sobre este tipo de insert!

Fiz assim:

        foreach ( $preventivas->dados as $preventiva ) {
            dd($preventiva);
        }
e retornou
{ # 575 
  + " preventiva_id ": 155226 
  + " status ": " Em análise pelo fornecedor "
  + " predio ": " ACAA-ACAA "
  + " UF ": " MG "
  + " preventive_type ": " Limpeza "
}
Insert. A model é Preventiva e está com o fillable ok
        foreach ( $preventivas->dados as $preventiva ) {
           Insert aqui se não existir ou update se existir.
        }
        }
Obrigado
Marcos Birro Calixto
Manager Carlos Ferreira 03/01/2020

Você pode inserir de diversas formas.

Uma delas seria inserir item por item dentro deste loop, exemplo:
foreach ( $preventivas->dados as $preventiva ) {
    $objeto = new NomeDoModel;
    $objeto->preventiva_id = $preventiva->preventiva_id;
    $objeto->status = $preventiva->status;
    $objeto->predio = $preventiva->predio;
    $objeto->UF = $preventiva->UF;
    $objeto->preventive_type = $preventiva->preventive_type;
    $objeto->save();
}

Outra alternativa:
foreach ( $preventivas->dados as $preventiva ) {
    NomeDoModel::create([
        'preventiva_id' => $preventiva->preventiva_id,
        'status' => $preventiva->status,
        'predio' => $preventiva->predio,
        'UF' => $preventiva->UF,
        'preventive_type' => $preventiva->preventive_type,
    ]);
}

Você também pode criar um array multidimensional desses items no loop, e inserir uma única vez com o método insert.
NomeDoModel::insert($array_multidimensional);

Carlos Ferreira
Sabe a Solução? Ajude a resolver!

Precisa estar logado para conseguir responder a este ticket!

Clique Aqui Para Entrar!