【问题标题】:How to save and update at the same time with laravel and vuelaravel和vue如何同时保存和更新
【发布时间】:2020-01-27 01:37:05
【问题描述】:

我遇到了一个在任何地方都找不到答案的问题。 我正在用后端的 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 的新手,没有找到任何可以帮助我的东西。 谁能给我指路?

提前致谢。

【问题讨论】:

  • 听起来应该是 2 个单独的请求:1x POST 和 1x PUT。你有什么理由不做 2 个请求?
  • 仅供参考 - 没有什么能阻止您直接从第一个函数调用另一个函数。但这对我来说感觉很奇怪。
  • 嗨@waterloomatt,感谢您的回复,在这种特殊情况下,我需要同时发出 POST 和 PUT 请求,这是场景,您在一台机器上进行维护并拥有一列中的值'n',当您再次在同一台机器上进行相同的维护时,新记录将具有此'n'值,旧记录将更新为's'值,所以当我保存第二条记录时,最旧的必须更新为“s”。
  • @waterloomatt,我实际上认为直接从另一个函数调用一个函数是一样的,但我得到了app.js:279 PUT http://localhost:8000/ 422 (Unprocessable Entity),带有另一个 php 函数,但它对我来说似乎也很hacky
  • 您能否编辑您的问题并添加您描述的场景+您认为相关的任何其他详细信息?听起来这可能是数据库触发器的理想选择,或者只是由单个请求启动的较长工作流。

标签: php laravel vue.js


【解决方案1】:

在我看来,您有 2 个选择。要么发起 2 个单独的请求(同时),要么发送一个请求,让 PHP 弄清楚如何处理插入和更新。

不确定TecManutencaoCadastroTecManutencaoCadastroM 之间的区别是什么,所以我只是从您的示例中复制/粘贴了它。

场景 1:发送 2 个请求

保留您的saveMaintenanceupdateMaintenance 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 请求以更新维护记录。

【讨论】:

  • 嗨@waterloomatt,感谢您的回答,我之前尝试过场景2但对我不起作用,出现方法不允许错误,我会尝试场景1并返回结果。
  • 嗨@waterloomatt,我已经尝试过方案1,它可以正常保存,但我的PUT方法不允许错误,更改了很多东西并且根本没有工作。我认为我必须在路由中传递一些参数,这次与我之前所做的更新不同,我会找到一种方法,不知何故,感谢迄今为止的所有帮助......
  • 最后我可以发帖并把请求放在一起,有点不同,但是,你的想法。非常感谢。
猜你喜欢
  • 2017-04-11
  • 2020-07-13
  • 2019-08-14
  • 2019-09-15
  • 2015-01-02
  • 2020-03-18
  • 2018-05-02
  • 2020-10-10
  • 2015-07-11
相关资源
最近更新 更多