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

Não consigo adicionar séries

Olá :) Consigo excluir as séries, mas não consigo adicionar novas. O erro:

SQLSTATE[23000]: Integrity constraint violation: 19 FOREIGN KEY constraint failed (SQL: insert into "episodios" ("numero", "temporada_id") values (1, 14))

SeriesController.php:

namespace App\Http\Controllers;

use App\Episodio;
use App\Http\Requests\SeriesFormRequest;
use App\Serie;
use App\Services\CriadorDeSerie;
use App\Temporada;
use Illuminate\Http\Request;

class SeriesController extends Controller
{
    public function index(Request $request) {
        $series = Serie::query()->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_temporada
        );

        $request->session()->
            flash('mensagem', "Série {$serie->id} criada com sucesso {$serie->nome}");

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

    public function destroy(Request $request)
    {
        $serie = Serie::find($request->id);
        $serie->temporadas->each(function (Temporada $temporada) {
            $temporada->episodios->each(function (Episodio $episodio) {
                $episodio->delete();
            });
            $temporada->delete();
        });

        Serie::destroy($request->id);
        $request->session()->
            flash('mensagem', "Série removida com sucesso");

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

CriadorDeSerie.php:

namespace App\Services;

use App\Serie;

class CriadorDeSerie
{
    public function criarSerie(
        string $nomeSerie,
        int $qtdTemporadas,
        int $epPorTemporada
    ) : Serie {
        $serie = Serie::create(['nome' => $nomeSerie]);
        for ($i = 1; $i <= $qtdTemporadas; $i++) {
            $temporada = $serie->temporadas()->create(['numero' => $i]);

            for ($j = 1; $j <= $epPorTemporada; $j++) {
                $temporada->episodios()->create(['numero' => $j]);
            }
        }

        return $serie;

    }
}
7 respostas

Olá, Amanda. Não parece ter nenhum erro não. Você consegue compartilhar seu projeto todo pra eu poder conferir e tentar reproduzir o erro?

Você pode ver ele no github: https://github.com/amandazk/projeto-laravel

Oi, Amanda. Sua migration de episódios está errada. Está fazendo relacionamento com a tabela de séries, ao invés de se relacionar com a tabela temporadas.

Vi também que você gerou a migration de episódios antes da de temporadas. Provavelmente vai dar erro. Renomeia os arquivos pra que a de temporadas fique antes. Acredito que resolva.

solução!

Fiz o que você falou e agora eu adiciono uma série e aparece o erro:

SQLSTATE[23000]: Integrity constraint violation: 19 FOREIGN KEY constraint failed (SQL: insert into "episodios" ("numero", "temporada_id") values (1, 18))

Mas quando eu volto para a listagem de séries, a nova série está lá, mas com o número errado de temporadas (só aparece "Temporada 1")

Mas você rodou as migrations do 0 pra refazer o banco?

Opa, tinha esquecido desse "detalhe". Agora foi. Muito obrigada.