我遇到了一个问题,即我无法在任何地方找到答案。 我在后端使用PHP(Laravel)在前端使用VueJs编写应用程序。 我已经成功地完成了整个应用程序的工作,但是现在,我必须同时保存和更新一个表,我将在代码之后进行解释。
场景更新
我正在编写维护控件,我必须在表中输入维护记录,因此,有些维护是定期进行的,并且我应该在下次维护即将到来时发出警告,这就是为什么我需要同时发布和发布。 我无法从vue向laravel发送单个请求,因为我使用的是路由,并且,如果它与POST方法一起使用,我会得到方法不允许错误,正如您在控制器功能中看到的那样,我已经尝试使用单个请求。
这是我在主vue文件中使用的路由:
<b-tab title="Cadastro de Manutenções">
<manutencao-cadastro
rotacadadd="manutencao/cadastro/"
rotamaquina="manutencao/cadastro/autcomp"
rotatipoautcomp="manutencao/cadastro/axios-tipo"
rotanomecolaborador="manutencao/cadastro/nomeColaborador"
rotacadsalvar="manutencao/cadastro/salvarManutencao"
rotacadatualizar="manutencao/cadastro/updateManute"
rotacaddel="manutencao/cadastro/deleteManute"
rotaatualizacadastro="manutencao/cadastro/atualizaCad"
/>
</b-tab>
这是我在vue上保存/更新的功能:
save(){
const method = this.maintenance.id ? 'put' : 'post'
const id = this.maintenance.id ? `/${this.maintenance.id}` : ''
const url = this.maintenance.id ? this.rotacadatualizar : this.rotacadsalvar
axios[method](`${url}${id}`, this.maintenance)
.then(() => {
this.reset()
}).catch((err) => {
console.error(err)
});
}
如您所见,此功能可以根据情况保存或更新,可以正常工作。
这是我在后端的功能:
public function saveMaintenance(Request $request)
{
$maquina = $this->ManutencaoMaquinasM
->where('descricao', $request->maquina)
->first();
$tecnico = $this->ColaboradorM
->where('nomecolaborador', $request->tecnico)
->first();
$manutencao = $this->TecManutencaoTipoM
->where('manutencao', $request->manutencao)
->first();
$dia = '';
$data = $this->TecManutencaoCadastroM->join('manutencao_maquinas', 'tec_manutencao_cadastros.maqId', 'manutencao_maquinas.id')
->select(DB::raw('max(tec_manutencao_cadastros.data) as date'))
->where('manutencaoId', $manutencao->id)
->where('manutencao_maquinas.descricao', $request->maquina)
->get();
foreach ($data as $dat) {
$dia = $dat->date;
}
try{
\DB::beginTransaction();
$input = $request->all();
$maintenance = new TecManutencaoCadastro();
$maintenance->maqId = $maquina->id;
$maintenance->tipoId = $input['tipo'];
$maintenance->manutencaoId = $manutencao->id;
$maintenance->tecnicoId = $tecnico->id;
$maintenance->data = $input['data'];
$maintenance->tempo = $input['tempo'];
$maintenance->obs = $input['obs'];
$maintenance->save();
/* $atualizar = $this->TecManutencaoCadastroM
->where('madIq', $maquina->id)
->where('manutencaoId', $manutencao->id)
->where('data', $dia)
->update(array('atendido' => 's')); */
//\Log::info($maintenance);
\DB::commit();
return response()->json('salvo', 200);
} catch (\Exception $e){
\DB::rollback();
return response()->json($e.'erro', 422);
}
}
当我必须保存数据时,也可以正常工作。 带注释的块在laravel中有效,但在vue中却无效。
这是要更新的功能:
public function updateMaintenance(Request $request)
{
$maquina = $this->ManutencaoMaquinasM
->where('descricao', $request->maquina)
->first();
$tecnico = $this->ColaboradorM
->where('nomecolaborador', $request->tecnico)
->first();
$manutencao = $this->TecManutencaoTipoM
->where('manutencao', $request->manutencao)
->first();
try{
\DB::beginTransaction();
$tipo = $this->TecManutencaoCadastroM->where('id', '=', $request->id)
->update(
array(
'maqId' => $maquina->id,
'tipoId' => $request->tipo,
'manutencaoId' => $manutencao->id,
'tecnicoId' => $tecnico->id,
'data' => $request->data,
'tempo' => $request->tempo,
'obs' => $request->obs
)
);
\DB::commit();
return response()->json('salvo', 200);
} catch (\Exception $e){
\DB::rollback();
return response()->json($e.'erro', 422);
}
}
按计划工作。
我的问题是,我试图在同一时间在表中保存一些新数据并更新同一行中的另一行,但是正如您在vue方法中看到的那样,当我保存时,路径指向到POST,当我更新时,路径指向PUT,我想这就是为什么我无法执行此操作的原因。 这是我这样做的一种方式吗? 我是vue的新手,没有发现任何可以帮助我的东西。 有人可以给我指出一些方向吗?
谢谢。
答案 0 :(得分:1)
从我的角度来看,您有2种选择。 (同时发起2个单独的请求),或者发送一个请求,然后让PHP确定如何处理插入和更新。
不确定TecManutencaoCadastro
和TecManutencaoCadastroM
之间的区别是什么,所以我只是从您的示例中复制/粘贴了它。
方案1:发送2个请求
保留您的saveMaintenance
和updateMaintenance
PHP方法,并对每个方法发起一个请求。例如Axios-Make multiple request at once (vue.js)
axios.all([
this.make_post_request(),
this.make_put_request()
])
...
make_post_request() {
return axios.post('...url...', { params: 'example' })
},
make_put_request() {
return axios.put('...url...', { params: 'example' })
}
...
方案2:发出单个(发布)请求
将所有数据与请求一起传递,然后让PHP确定如何处理请求。这种情况只是扩展了post
(插入)功能,以处理您的特定用例,还可以更新先前的维护记录(如果存在)。
save(){
axios['post'](`...url...`, this.maintenance)
.then(() => {
...
})
);
}
PHP
public function saveMaintenance(Request $request)
{
// Begin transaction
// The request has an `id` parameter so do the update to set the status to `s`.
if ($request->has('id')) {
$tipo = $this->TecManutencaoCadastroM->where('id', '=', $request->id)
->update(
...
);
}
// Finally, create the new maintenance row with value `n`.
$maintenance = new TecManutencaoCadastro();
...
$maintenance->save();
// Commit transaction
}
当您要实际发出updateMaintenance
请求更新维护记录时,应保留put
。