3
respostas

Erro ao adicionar Serie/temporadas/episodios

Prezado Professor e colegas, poderiam me ajudar? Estou na aula 02.02 de Laravel parte 2: Trabalhando com Autenticação, Relacionamentos e Testes

E ao adicionar uma seria/temporadas/episodios retorna o seguinte erro: Illuminate\Database\QueryException SQLSTATE[HY000]: General error: 1 table tb_temporadas has no column named tb_serie_id (SQL: insert into "tb_temporadas" ("numero", "tb_serie_id") values (1, 12)) http://localhost:8000/series/criar

Não encontrei em nenhum lugar onde foi definido o campo tb_serie_id

segue como está implementado o código das migrations:

Arquivo 2021_05_11_172901_create_temporadas_table.php

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateTemporadasTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tb_temporadas', function (Blueprint $tabela) {
            $tabela->increments('id');
            $tabela->integer('numero');
            $tabela->integer('serie_id');
            $tabela->foreign('serie_id')->references('id')->on('tb_series');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('tb_temporadas');
    }
}

Arquivo 2021_05_10_191925_criar_tabela_series.php

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CriarTabelaSeries extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tb_series', function(Blueprint $tabela){
            $tabela->increments('id');
            $tabela->string('nome', 50);
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('tb_series');
    }
}

O que fiz de diferente da aula foi dar nome diferente às tabelas (tb_series, tb_temporadas e tb_episodios). Estou usando o Laravel 8.40.0 e o PHP 8.0.3

3 respostas

Acho que o problema está no Model por você estar usando tabelas despadronizadas (em relação ao que o Eloquent espera).

Tente o seguinte: renomear o campo da tabela de temporadas referente à chave estrangeira para tb_serie_id ao invés de serie_id

OU,

Na Model das temporadas você define o relacionamento com as Séries como: return $this->belongsTo(Model da Serie, chave estrangeira da Temporada entre aspas, que no caso é 'serie_id');

Caique, se alterar o nome funciona sim. Mas muitas vezes nos deparamos com banco de dados já prontos, onde os nomes são por exemplo: SQ_PESSOA, COD_PESSOA, etc. Como adaptar meu código ao banco de dados?

Então, você tem que fazer como no segundo caso que eu citei.

O Eloquent permite que você indique qual o nome do atributo na tabela que será a chave estrangeira. Por exemplo, nesse seu caso, na hora de definir a relação, você poderia fazer o seguinte na Model das Temporadas:

public function serie()
{
    return $this->belongsTo(Serie::class, 'serie_id');
}

Assim você deixa explícito que o campo que referencia a tabela de séries (a chave estrangeira) é o série_id. Você pode fazer ainda mais e deixar explícito qual campo é referenciado na tabela Série, que no caso seria o id, adicionando mais outro parâmetro:

public function serie()
{
    return $this->belongsTo(Serie::class, 'serie_id', 'id');
}

Não sei se deu pra entender, mas qualquer coisa você pode dar uma olhada na documentação: https://laravel.com/docs/8.x/eloquent-relationships