method PUT
Como dar update passando um array multidimensional?
Olá Regina, tudo bem?
No caso para editar será necessário fazer um loop. Diferente da ação de salvar que permite passar um array com vários registros a serem inseridos, para editar é diferente, precisa especificar exatamente qual registro é para editar.
Você tem o formato do array dos registros que deseja editar? Se quiser me enviar, posso te dá um exemplo aplicado ao que já possui.
Esse é o endipont:
O endpoint é esse:
{
"data": {
"cd_curso": 65,
"tx_nome": "Embriologia TGI XXXXX",
"tx_descricao": "
Embriologia do TGI
",
"tx_programa": "
",
"tx_corpo_docente": "",
"nr_max_alunos": 0,
"dt_criacao": "2016-02-13",
"dt_inicio": "2017-08-25",
"dt_fim": "2028-04-14",
"ds_img_apresentacao": "1519388019-curso-img-002.jpg",
"ds_link_demo_video": "https://www.youtube.com/embed/zz8iaJ9_tX8",
"cd_modelo_curso": 1,
"dt_publicacao": "2017-08-23 00:00:00",
"st_modo_curso": 1,
"referencia": "embriologia SSSSS",
"ds_arquivo_termos": "",
"dt_fim_inscricao_curso": "2026-07-16",
"st_status_publicacao": 1,
"st_demo": 0,
"ds_msg_email_confirmacao": "",
"ds_ano": null,
"co_curso_especialidade": null,
"co_curso_segmento": null,
"idSubdisciplina": null,
"idPeriodo": null,
"uf": "RJ",
"st_concurso": 2,
"tx_nome_reduzido": "",
"tx_descricao_breve": "Embriologia",
"cd_categoria_curso": 4,
"st_ordenacao": 2,
"id_empresa": 1,
"updated_at": "2019-04-14 19:34:34",
"created_at": "2018-10-31 13:02:21",
"subdisciplinas": [],
"modalidades": [
{
"co_modalidade_concurso": 39,
"ds_modalidade_concurso": "ATP-ACB",
"tx_nome_concurso": "SMS",
"co_publico_alvo": 1,
"sg_modalidade_concurso": "ATP\t\t\t\t",
"tx_modalidade_concurso": "Atenção Primária",
"id_empresa": 1,
"pivot": {
"cd_curso": 65,
"co_modalidade": 39
}
},
{
"co_modalidade_concurso": 65,
"ds_modalidade_concurso": "CTI-ACB",
"tx_nome_concurso": "DOR",
"co_publico_alvo": 1,
"sg_modalidade_concurso": "CTI",
"tx_modalidade_concurso": "Centro de Tratamento Intensivo",
"id_empresa": 1,
"pivot": {
"cd_curso": 65,
"co_modalidade": 65
}
},
{
"co_modalidade_concurso": 67,
"ds_modalidade_concurso": "CTI-ACB",
"tx_nome_concurso": "HIAS",
"co_publico_alvo": 1,
"sg_modalidade_concurso": "CTI",
"tx_modalidade_concurso": "Centro de Tratamento Intensivo",
"id_empresa": 1,
"pivot": {
"cd_curso": 65,
"co_modalidade": 67
}
},
{
"co_modalidade_concurso": 85,
"ds_modalidade_concurso": "CTI-ACB",
"tx_nome_concurso": "JKDOR",
"co_publico_alvo": 1,
"sg_modalidade_concurso": "CTI",
"tx_modalidade_concurso": "Centro de Tratamento Intensivo",
"id_empresa": 1,
"pivot": {
"cd_curso": 65,
"co_modalidade": 85
}
},
{
"co_modalidade_concurso": 89,
"ds_modalidade_concurso": "CTI-ACB",
"tx_nome_concurso": "JK",
"co_publico_alvo": 1,
"sg_modalidade_concurso": "CTI",
"tx_modalidade_concurso": "Centro de Tratamento Intensivo",
"id_empresa": 1,
"pivot": {
"cd_curso": 65,
"co_modalidade": 89
}
}
],
"coordenadores": [
{
"cd_curso": 65,
"cd_professor": 23,
"pivot": {
"cd_curso": 65,
"cd_professor": 23
}
},
{
"cd_curso": 65,
"cd_professor": 29,
"pivot": {
"cd_curso": 65,
"cd_professor": 29
}
},
},
"status": true
}
Estou tentando gravar so modalidades[]:
public function update(Request $request, $id)
{
foreach ($data as $value) {
//if(isset($data['tx_nome'])? $data['tx_nome'] : NULL)
if (empty($value)) {
$value = NULL;
//echo $value."<br>";
}
}
//dd($data);
$guzzle = new Guzzle;
if (isset($data['select-modalidade'])) {
$result = $guzzle->get(config('ambiente.URL_API').'modalidades/');
$modalidades = json_decode($result->getBody(),true);
//Aqui monto cada modalidade vinda no request
foreach ($modalidades['data'] as $modalidade) {
for ($i=0; $i < count($data['select-modalidade']); $i++) {
$key = in_array($data['select-modalidade'][$i],$modalidade);
if ($key) {
//$data['select-modalidade'][$i] = $modalidade;
$data['select-modalidade'][$i] = ["co_modalidade_concurso" => $modalidade['co_modalidade_concurso'],
"ds_modalidade_concurso" => $modalidade['ds_modalidade_concurso'],
"tx_nome_concurso" => $modalidade['tx_nome_concurso'],
"ds_modalidade_concurso" => $modalidade['ds_modalidade_concurso'],
"co_publico_alvo" => $modalidade['co_publico_alvo'],
"sg_modalidade_concurso" => $modalidade['sg_modalidade_concurso'],
"tx_modalidade_concurso" => $modalidade['tx_modalidade_concurso'],
"id_empresa" => $modalidade['id_empresa'],
"pivot" =>
["cd_curso" => $data['cd_curso'],
"co_modalidade" => $modalidade['co_modalidade_concurso'],
]
];
}
}
}
$mod = $data['select-modalidade'];
}
/*try{
$options = [
'tx_nome' => $data['tx_nome'],
'referencia' => $data['referencia'],
'cd_categoria_curso' => $data['cd_categoria_curso'],
'cd_modelo_curso' => $data['cd_modelo_curso'],
'st_status_publicacao' => $data['st_status_publicacao'],
'tx_descricao_breve' => $data['tx_descricao_breve'],
'tx_descricao' => $data['tx_descricao'],
'st_concurso' => $data['st_concurso'],
'modalidades[]' => $mod ];
$options = json_encode($options); dd($options);*/
$result = $guzzle->put(config('ambiente.URL_API').'cursos/'.$id,[
'form_params' => ['modalidades[]' => $mod ]]
]);
//echo $result->getStatusCode();exit;
/*'form_params' => [
'tx_nome' => $data['tx_nome'],
'referencia' => $data['referencia'],
'cd_categoria_curso' => $data['cd_categoria_curso'],
'cd_modelo_curso' => $data['cd_modelo_curso'],
'st_status_publicacao' => $data['st_status_publicacao'],
'tx_descricao_breve' => $data['tx_descricao_breve'],
'tx_descricao' => $data['tx_descricao'],
'modalidades' => array($data['select-modalidade'])
]
]);*/
$response = $result->getBody()->getContents();
$cursos = json_decode($response);
} catch (RequestException $e){
echo "erro = ".$e;exit;
}
return redirect()->action('CursosDescricaoController@index', ['id' => $id]);
}
Desculpe a funcao estava com alguns erros. Corrigidos agora:
public function update(Request $request, $id)
{
$data = $request->all();
foreach ($data as $value) {
//if(isset($data['tx_nome'])? $data['tx_nome'] : NULL)
if (empty($value)) {
$value = NULL;
//echo $value."<br>";
}
}
//dd($data);
$guzzle = new Guzzle;
if (isset($data['select-modalidade'])) {
$result = $guzzle->get(config('ambiente.URL_API').'modalidades/');
$modalidades = json_decode($result->getBody(),true);
//Aqui monto cada modalidade vinda no request
foreach ($modalidades['data'] as $modalidade) {
for ($i=0; $i < count($data['select-modalidade']); $i++) {
$key = in_array($data['select-modalidade'][$i],$modalidade);
if ($key) {
//$data['select-modalidade'][$i] = $modalidade;
$data['select-modalidade'][$i] = ["co_modalidade_concurso" => $modalidade['co_modalidade_concurso'],
"ds_modalidade_concurso" => $modalidade['ds_modalidade_concurso'],
"tx_nome_concurso" => $modalidade['tx_nome_concurso'],
"ds_modalidade_concurso" => $modalidade['ds_modalidade_concurso'],
"co_publico_alvo" => $modalidade['co_publico_alvo'],
"sg_modalidade_concurso" => $modalidade['sg_modalidade_concurso'],
"tx_modalidade_concurso" => $modalidade['tx_modalidade_concurso'],
"id_empresa" => $modalidade['id_empresa'],
"pivot" =>
["cd_curso" => $data['cd_curso'],
"co_modalidade" => $modalidade['co_modalidade_concurso'],
]
];
}
}
}
$mod = $data['select-modalidade'];
dd($mod);
}
try{
$options = [
'tx_nome' => $data['tx_nome'],
'referencia' => $data['referencia'],
'cd_categoria_curso' => $data['cd_categoria_curso'],
'cd_modelo_curso' => $data['cd_modelo_curso'],
'st_status_publicacao' => $data['st_status_publicacao'],
'tx_descricao_breve' => $data['tx_descricao_breve'],
'tx_descricao' => $data['tx_descricao'],
'st_concurso' => $data['st_concurso'],
'modalidades[]' => $mod ];
$options = json_encode($options); dd($options);
$result = $guzzle->put(config('ambiente.URL_API').'cursos/'.$id,[
'form_params' => ['modalidades[]' => $mod ]
]);
//echo $result->getStatusCode();exit;
/*'form_params' => [
'tx_nome' => $data['tx_nome'],
'referencia' => $data['referencia'],
'cd_categoria_curso' => $data['cd_categoria_curso'],
'cd_modelo_curso' => $data['cd_modelo_curso'],
'st_status_publicacao' => $data['st_status_publicacao'],
'tx_descricao_breve' => $data['tx_descricao_breve'],
'tx_descricao' => $data['tx_descricao'],
'modalidades' => array($data['select-modalidade'])
]
]);*/
$response = $result->getBody()->getContents();
$cursos = json_decode($response);
} catch (RequestException $e){
echo "erro = ".$e;exit;
}
return redirect()->action('CursosDescricaoController@index', ['id' => $id]);
}
dd($mod) retorna:array:5 [▼
0 => array:8 [▼ "co_modalidade_concurso" => 65 "ds_modalidade_concurso" => "CTI-ACB" "tx_nome_concurso" => "DOR" "co_publico_alvo" => 1 "sg_modalidade_concurso" => "CTI" "tx_modalidade_concurso" => "Centro de Tratamento Intensivo" "id_empresa" => 1 "pivot" => array:2 [▶] ] 1 => array:8 [▼ "co_modalidade_concurso" => 67 "ds_modalidade_concurso" => "CTI-ACB" "tx_nome_concurso" => "HIAS" "co_publico_alvo" => 1 "sg_modalidade_concurso" => "CTI" "tx_modalidade_concurso" => "Centro de Tratamento Intensivo" "id_empresa" => 1 "pivot" => array:2 [▶] ] 2 => array:8 [▼ "co_modalidade_concurso" => 89 "ds_modalidade_concurso" => "CTI-ACB" "tx_nome_concurso" => "JK" "co_publico_alvo" => 1 "sg_modalidade_concurso" => "CTI" "tx_modalidade_concurso" => "Centro de Tratamento Intensivo" "id_empresa" => 1 "pivot" => array:2 [▶] ]
]
Já tentei dar um encode e enviar como json. Não funcionou.
Olá!
O caminho é esse mesmo, será necessário fazer um loop e recuperar o registro e fazer o update de item por item (dentro do loop).
No caso você precisa pegar esse retorno que está em JSON e usar a função do PHP json_decode para transformar em um [fazer o loop para modificar.
Neste exemplo:
$response = [
[
"co_modalidade_concurso" => 65
"ds_modalidade_concurso" => "CTI-ACB"
"tx_nome_concurso" => "DOR"
"co_publico_alvo" => 1
"sg_modalidade_concurso" => "CTI"
"tx_modalidade_concurso" => "Centro de Tratamento Intensivo"
"id_empresa" => 1
"pivot" => [
],
[
"co_modalidade_concurso" => 67
"ds_modalidade_concurso" => "CTI-ACB"
"tx_nome_concurso" => "HIAS"
"co_publico_alvo" => 1
"sg_modalidade_concurso" => "CTI"
"tx_modalidade_concurso" => "Centro de Tratamento Intensivo"
"id_empresa" => 1
"pivot", [
],
[
"co_modalidade_concurso" => 89
"ds_modalidade_concurso" => "CTI-ACB"
"tx_nome_concurso" => "JK"
"co_publico_alvo" => 1
"sg_modalidade_concurso" => "CTI"
"tx_modalidade_concurso" => "Centro de Tratamento Intensivo"
"id_empresa" => 1
"pivot", [
],
];
foreach ($response as $data) {
$model = NameModel::where('co_modalidade_concurso', $data['co_modalidade_concurso'])->first();
$model->update($data);
}
Por favor, seria isso? Pq não funcionou.
$guzzle = new Guzzle;
if (isset($data['select-modalidade'])) {
$result = $guzzle->get(config('ambiente.URL_API').'modalidades/');
$modalidades = json_decode($result->getBody(),true);
//Aqui monto cada modalidade vinda no request
foreach ($modalidades['data'] as $modalidade) {
//dd($modalidade);
for ($i=0; $i < count($data['select-modalidade']); $i++) {
$key = in_array($data['select-modalidade'][$i],$modalidade);
if ($key) {
//$data['select-modalidade'][$i] = $modalidade;
$data['select-modalidade'][$i] = ["co_modalidade_concurso" => $modalidade['co_modalidade_concurso'],
"ds_modalidade_concurso" => $modalidade['ds_modalidade_concurso'],
"tx_nome_concurso" => $modalidade['tx_nome_concurso'],
"ds_modalidade_concurso" => $modalidade['ds_modalidade_concurso'],
"co_publico_alvo" => $modalidade['co_publico_alvo'],
"sg_modalidade_concurso" => $modalidade['sg_modalidade_concurso'],
"tx_modalidade_concurso" => $modalidade['tx_modalidade_concurso'],
"id_empresa" => $modalidade['id_empresa'],
"pivot" =>
["cd_curso" => $data['cd_curso'],
"co_modalidade" => $modalidade['co_modalidade_concurso'],
]
];
//dd($data['select-modalidade'][$i]);
}
}
}
$options = $data['select-modalidade'];
//($options);
foreach ($options as $option) {
try{
$result = $guzzle->put(config('ambiente.URL_API').'cursos/'.$id, [
'form_params' => ['modalidades'=> $option]
]);
//dd($option);exit;
$response = $result->getBody()->getContents();
$cursos = json_decode($response);
//echo $result->getStatusCode();exit;
} catch (RequestException $e){
echo "erro = ".$e;exit;
}
}
}
return redirect()->action('CursosDescricaoController@index', ['id' => $id]);
Olá!
Por mais que me passou um debug dos dados esse retorno ainda é muito abstrato para mim conseguir analisar esse trecho de código e entender onde errou.
Vi que organizou os itens em um array, mas não vi o update.
Ou seja, onde recupera o registro e faz o update definitivo: Model::where('col', value)->first()->update($data)
Esse retorno dessa API, porque retorna tantos registros para serem atualizados?
Embora eu tenha uma visão muito limitada do seu projeto, acredito que usar alguma tecnologia frontend (como o Vue.js por exemplo) tornaria o seu trabalho muito mais simples, especialmente no tocante requisições na API.
Retorna muitos registros pq a API tem varios joias com outras tabelas. E eu estou usando o Guzzle.
Foi apenas uma curiosidade, porque esse tipo de comportamento em uma API não é algo comum, pelo menos não para fazer update em múltiplos registros, mas sim para inserir.
Talvez migrar o projeto para o Vue.js dê um bom trabalho, não tem problemas, dá para fazer com o Guzzle, como está fazendo.
Está faltando recuperar o registro no loop e fazer o update.
Dentro do loop (do retorno da API) precisa fazer algo semelhante a isso:
$objectModel = Model::where('co_modalidade_concurso', $modalidade['co_modalidade_concurso'])->first();
// $data é interação do loop
$objectModel->update($data);
Precisa estar logado para conseguir responder a este ticket!
Clique Aqui Para Entrar!