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

Série esta sendo deletada só que ela não some da listagem

E ai pessoal!!

Estou utilizando a versão 8.54 do Laravel.

A série esta sendo deletada e aparece a mensagem flash com o nome da série deletada, só que o nome dela não esta saindo da listagem:

RemovedorDeSerie.php

<?php

namespace App\Services;

use App\Models\{Serie, Temporada, Episodio};
use Illuminate\Support\Facades\DB;

class RemovedorDeSerie
{
    public function removerSerie(int $serieId): string
    {
        $nomeSerie = '';
        DB::transaction(function () use ($serieId, &$nomeSerie) {
            $serie = Serie::find($serieId);
            $nomeSerie = $serie->nome;
            $this->removerTemporadas($serie);
        });

        return $nomeSerie;
    }

    private function removerTemporadas(Serie $serie) 
    {
        $serie->temporadas()->each(function (Temporada $temporada) {
            $this->removerEpisodios($temporada);
            $temporada->delete();
        });
    }

    private function removerEpisodios(Temporada $temporada) 
    {
        $temporada->episodios()->each(function (Episodio $episodio) {
            $episodio->delete();
        });
    }
}

SeriesController.php

<?php

namespace App\Http\Controllers;

use App\Http\Requests\SeriesFormRequest;
use Illuminate\Http\Request;
use App\Models\Serie;
use App\Services\CriadorDeSerie;
use App\Services\RemovedorDeSerie;

class SeriesController extends Controller
{
    public function index(Request $request) 
    {
        $series = Serie::orderBy('nome')->get();

        $mensagem = $request->session()->get('mensagem');

        return view('series.index', compact('series', 'mensagem'));
    }

    public function create()
    {
        return view('series.create');
    }

    public function store(SeriesFormRequest $request, CriadorDeSerie $criadorDeSerie)
    {
        $serie = $criadorDeSerie->criarSerie(
            $request->nome, 
            $request->qtd_temporadas, 
            $request->ep_por_temporadas
        );

        $request->session()
            ->flash(
                'mensagem', 
                "Série { $serie->id } e suas temporadas e episódios criados com sucesso { $serie->nome }"
            );

        return redirect()->route('listar_series');
    }

    public function destroy(Request $request, RemovedorDeSerie $removedorDeSerie)
    {
        $nomeSerie = $removedorDeSerie->removerSerie($request->id);

        $request->session()
            ->flash(
                'mensagem',
                "Série $nomeSerie removida com sucesso"
            );

        return redirect()->route('listar_series');
    }
}

series.index

@extends('layout')

@section('cabecalho')
Séries
@endsection

@if(!empty($mensagem))
@section('conteudo')
<div class="alert alert-success">
    {{ $mensagem }}
</div>
@endif



<a href="{{ route('form_listar_serie') }}" class="btn btn-dark mb-2">Adicionar</a>

<ul class="list-group">
    @foreach($series as $serie)
        <li class="list-group-item d-flex justify-content-between align-items-center">
            {{ $serie->nome }}

            <span class="d-flex">
                <a href="/series/{{ $serie->id }}/temporadas" class="btn btn-info btn-sm mr-1">
                    <i class="fas fa-external-link-alt"></i>
                </a>
                <form method="post" action="/series/{{ $serie->id }}" onsubmit="return confirm('Tem certeza que deseja remover? {{ addslashes( $serie->nome ) }}')">
                    @csrf
                    @method('DELETE')
                    <button class="btn btn-danger">
                        <i class="far fa-trash-alt"></i>
                    </button>
                </form>
            </span>
        </li>
    @endforeach
</ul>

@endsection

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

2 respostas

Bom dia, tenho uma sugestão rápida para você resolver, criar uma coluna status na tabela de series, e quando remover você seta removido ou false por exemplo e na tua listagem na query que monta a pagina você, coloca essa condicao, so mostrar aonde status for = a true por exemplo. Segue abaixo uma ideia de codigo;

Listagem:

public function index(Request $request) 
    {
        $series = Serie::where('status', '=', true)->orderBy('nome')->get();

        $mensagem = $request->session()->get('mensagem');

        return view('series.index', compact('series', 'mensagem'));
    }

Exclusão

public function removerSerie(int $serieId): string
    {
        $nomeSerie = '';
        DB::transaction(function () use ($serieId, &$nomeSerie) {
            $serie = Serie::find($serieId);
            $nomeSerie = $serie->nome;
            $this->removerTemporadas($serie);
        });

        // ideia de código
        if ($serieAntes != $serieDepois) {
            Db::table('serie')->where('serieId', $request->serieId)
                ->update(['status' => false]);
        }

        return $nomeSerie;
    }

Beleza, eu fiz este esboço de ideia de código para tentar ajudar mais na interpretação e lógica para resolver, não vai funcionar na integra talvez dê erros de sintaxe. Espero ter ajudado. Abraço

solução!

Oi Giovane, obrigado pela ideia.

Depois de alguns dias consegui resolver esse meu problema, eu só precisava acrescentar um $serie->delete(); neste método:

public function removerSerie(int $serieId): string
    {
        $nomeSerie = '';
        DB::transaction(function () use ($serieId, &$nomeSerie) {
            $serie = Serie::find($serieId);
            $nomeSerie = $serie->nome;

            $this->removerTemporadas($serie);
            $serie->delete();
        });

        return $nomeSerie;
    }

Mais mesmo assim obrigado pela ideia, vou utilizar ela em outras ocasiões!!!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software