Как сохранить и обновить одновременно с laravel и vue - PullRequest
1 голос
/ 26 сентября 2019

У меня проблема в том, что я нигде не мог найти ответ.Я пишу приложение с PHP (Laravel) в бэкэнде и VueJs во внешнем интерфейсе.Мне удалось сделать все приложение без особых проблем, но теперь мне нужно сохранить и обновить одну таблицу одновременно, я объясню, следуя коду.

Обновление сценария

Я пишу элемент управления техобслуживанием, мне нужно вводить записи о техобслуживании в таблицу, поэтому есть некоторые техобслуживания, которые выполняются периодически, и я должен предупредить, когда будет следующее обслуживание, этопочему мне нужно POST и положить в то же время.Я не могу отправить один запрос от 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 и не нашел ничего, что могло бы мне помочь.Кто-нибудь может указать мне несколько направлений, пожалуйста?

Заранее спасибо.

1 Ответ

0 голосов
/ 27 сентября 2019

Как я вижу, у вас есть 2 варианта.Либо инициируйте 2 отдельных запроса (одновременно), либо отправьте один запрос и позвольте PHP выяснить, как обрабатывать вставку и обновление.

Не уверен, в чем разница между TecManutencaoCadastro иTecManutencaoCadastroM, поэтому я просто скопировал / вставил его из вашего примера.

Сценарий 1: Отправьте 2 запроса

Сохраните оба saveMaintenance и updateMaintenance PHP методы и инициировать отдельный запрос для каждого.Ex. Axios - сделать несколько запросов одновременно (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: Сделать один (пост) запрос

Passвсе ваши данные вместе с запросом, и пусть 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 запрос на обновление записи об обслуживании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...