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

Sugestão de Implementação da atualização de Episódios

Estou compartilhando por que não sei se, dessa forma, seria a maneira correta, mas executou super rápido aqui e eu gostaria de compartilhar, eu até achei mais simples do que a implementação feita pelo professor.

        DB::beginTransaction();
        try {
            $episodes = $request->episodes;

            $query = "season_id = $season->id AND id IN(";
            for ($i = 0; $i < count($episodes); $i++) {
                if (count($episodes) - $i == 1) {
                    $query .= "$episodes[$i]";
                } else {
                    $query .= "$episodes[$i],";
                }

            }
            $query .= ");";
            DB::table('episodes')->whereRaw($query)->update(["watched" => true]);
        } catch (\Exception $e) {
            throw new \Exception($e->getMessage());
        }

        DB::commit();

        return to_route('episodes.index', $season->id)->with('mensagem.sucesso', 'Episódio atualizado com sucesso!');

Começo com o BeginTransaction, e então já abro o try pegando os episódios da requisição e crio uma variavel chamada "query", e ja explico o por que dessa forma Dito isso, eu faço interação, eu posso receber 2 ou centenas de ID'S nessa requisição, e essa interação conta quantos tem, e adiciona a query o id dentro do IN (metodo do mysql), no final da iteração, eu adiciono o ); para fechar a query Em seguida, eu puxo o DB::table('episodes') para justamente puxar a tabela de episodios (você pode fazer isso puxando a propria classe Episodes, fica a seu critério), assim, eu uso o método "whereRaw", pesquisando um pouco e vendo como ele funciona, ele vai adicionar um WHERE na query, junto com o argumento passando nela, nesse caso, o "query", e por isso eu o escrevi daquele jeito.

em seguida, dou o update com watched recebendo true e realizo o commit, n sei se é a melhor maneira, estou aberto a sugestões

2 respostas

Oi João, tudo bem?

Obrigada por compartilhar sua implementação para a atualização de episódios. Parece que você encontrou uma forma mais simples e rápida de realizar essa tarefa.

A utilização do DB::beginTransaction() e DB::commit() é uma boa prática quando se trata de transações no banco de dados. Isso garante que todas as alterações sejam feitas de forma atômica, ou seja, ou todas são realizadas com sucesso, ou nenhuma é realizada.

Quanto à sua implementação da query, parece que você está construindo uma cláusula IN dinamicamente, com base nos IDs dos episódios recebidos na requisição. Essa é uma abordagem válida e pode ser útil quando você precisa atualizar vários registros de uma vez.

Um abraço e bons estudos.

solução!

Na verdade, eu encontrei uma forma ainda melhor de fazer essa implementação

        DB::beginTransaction();

        try {
            $episodes = $request->episodes;
            $season_id = $season->id;

            //$episode_ids = implode(',', $episodes);

            DB::table('episodes')
                ->where('season_id', $season_id)
                ->whereIn('id', $episodes)
                ->update(['watched' => true]);
        } catch (\Exception $e) {
            DB::rollBack();
            throw new \Exception($e->getMessage());
        }

        DB::commit();

Desta vez, eu implementei o DB::rollBack, no caso de alguma parte der erro e ele cancelar toda a operação, e também substitui o for pela clausula "whereIn" do proprio DB, o codigo fica mais limpo, menor e mais legivel