Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Erro illegal string offset

Bom dia, Estou com um pequeno problema, estou desenvolvendo uma API Rest com Laravel, e no @POST da minha API está surgindo esse erro. illegal String Offset.

Segue o Código, o Erro é no @POST.

$data = $request->json()->all();

        $usuario_id = $data['usuario']['id'];

        foreach ($data as $contatos) {

            foreach ($contatos as $contato) {

                $params = array('id' => $contato['id'],
                                'nome' => $contato['nome'],
                                'telefone' => $contato['telefone'],
                                'usuario_id' => $usuario_id
                                 );

                $contato = Contato::create($params);
                $contato->save();

            }            

        }

O erro é na linha

$params = array('id' => $contato['id'],

ele faz o insert no banco normal, mas aparece esse erro.

5 respostas

Oi Dionísio, tudo bem? Dá um dd($data) pra gente ver oque está sendo retornado pelo all do request? Assim a gente pode ter uma noção melhor do que pode estar acontecendo! Cola a saída do dd aqui por favor

Beleza, segue o dd($data).

o Id é gerado pelo UUID(), e no banco o campo que recebe o Id está configurado com char(36). o retorno é grande, eu reduzir um pouco, mas a estrutura é essa aí.

array(2) {
   ["contatos"]=>
   array(163) {
     [0]=>
     array(3) {
       ["id"]=>
       string(36) "c84e8b15-ada1-4f1b-bbf9-364cc41081ff"
       ["nome"]=>
       string(7) "A Silva"
       ["telefone"]=>
       string(12) "6129999-9999"
     }
     [1]=>
     array(3) {
       ["id"]=>
       string(36) "d84783d0-4003-49b7-a692-3822a356cf4c"
       ["nome"]=>
       string(5) "Aaaaa"
       ["telefone"]=>
       string(12) "6128888-8888"
     }
     [2]=>
     array(3) {
       ["id"]=>
       string(36) "01224dab-2906-47de-a931-eb5f80256889"
       ["nome"]=>
       string(7) "Adriana"
       ["telefone"]=>
       string(11) "617777-7777"
     }
     ["usuario"]=>
   }  
   array(4) {
     ["email"]=>
     string(25) "xxx@gmail.com"
     ["senha"]=>
     string(32) "3basctco512o56d6af0fa4b8b330d162e19938ee981"
     ["nome"]=>
     string(8) "Dionisio"
     ["id"]=>
     int(6)
   }
 }
solução!

O problema está aqui: foreach ($data as $contatos) {

Aqui ele percorre todo o array $data foreach ($data as $contatos) {. O index 'contatos' é inserido ok pois tem os campos que você espera: id nome telefone usuario_id. Quando chega no index 'usuario' ele quebra pois não tem mais essa info pra inserir.

Troque por esse: foreach ($data['contatos'] as $contatos) {, apontando diretamente para o index que você quer inserir e remova o outro foreach. Código sugerido:

foreach ($data['contatos'] as $contato) {
    $params = array(
        'id'         => $contato['id'],
        'nome'       => $contato['nome'],
        'telefone'   => $contato['telefone'],
        'usuario_id' => $usuario_id
    );

    $contato = Contato::create($params);
    $contato->save();
}

Dionísio, testa a solução do Ricardo depois dá um feedback aqui do que aconteceu? Se resolveu ou não pra gente explorar mais tá bem? Fico no aguardo!

Deu Certo, Obrigado Ricardo e Wanderson, funcionou, desculpa a Demora. O jeito que o Ricardo escreveu deu certinho.