4
respostas

Erro ao pesquisar registros usando chave estrangeira

Ola vinícius Estou fazendo uma aplicação seguindo a sua aula. Minha aplicação cadastra livros e seus capitulos. O cadastro de livros está ok, agora estou tentando listar os capitulos de um livro e aparece o seguinte erro:

Illuminate \ Database \ QueryException (42S22)
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'capitulo.livro_codigo' in 'where clause' (SQL: select * from `capitulo` where `capitulo`.`livro_codigo` = 5 and `capitulo`.`livro_codigo` is not null)

No meu banco a tabela capitulo nao tem o campo livro_codigo (mostrado no erro), nao sei de onde ele pega isso, a FK da tabela capitulo é o campo codigo (mesmo nome do campo na tabela livro). No meu banco, a tabela livro tem os campos: codigo (PK autoincremento), nome, edicao e ano; e a tabela capitulo tem os campos: codigoCap(pk autoincremento), nome, descricao e codigo(fk com livro). Estou usando o mySQL.

Veja os códigos abaixo das classes do model:

<?php

namespace App;

use illuminate\Database\Eloquent\Model;

class Livro extends  Model{

    // se o nome não for indicado será utilizado o nome da classe no plural iniciado em minúsculo
    protected $table = 'livros';
    public $timestamps = false;
    protected $primaryKey = 'codigo';
    protected $fillable=['nome','edicao','ano'];

    public function capitulos(){
        return $this->hasMany(Capitulo::class);
    }
}
?>
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Capitulo extends Model
{
    //
    protected $table = 'capitulo';
    public $timestamps = false;
    protected $primaryKey = 'codigoCap';
    protected $fillable=['nome','descricao','codigo'];

    public function autores(){
        return $this->hasMany(Autor::class);
    }

    public function livro(){
        return $this->belongsTo(Livro::class);
    }
}

Preciso informar o mapeamento da chave estrangeira em algum lugar? Isso já está dito no mysql.

Obrigada

4 respostas

Dentro do hasMany e belongsTo você tem que informar o nome da sua FK:

return $this->hasMany(Capitulo::class,'codigo');

return $this->belongsTo(Livro::class,'codigo');

Veja também na documentação do Laravel este link: https://laravel.com/docs/7.x/eloquent-relationships#one-to-many

oi Antony

Por algum motivo agora não consigo rodar nada relacionado a BD, aparece o erro

Illuminate \ Database \ QueryException
could not find driver (SQL: insert into `livros` (`nome`, `edicao`, `ano`) values (teste q, 2, 3000))
Previous exceptions
could not find driver (0)

Você sabe o que pode ter acontecido? Lembrando que estou usando o MySQL e ja estava fazendo inclusoes e pesquisas sem problemas.

Estranho ter parado de funcionar do nada!

É difícil eu saber o que pode ter acontecido sem ter uma visão do todo, mais vou aqui colocar algumas possíveis causas.

  • Caso este problema tenha acontecido depois de você baixar um projeto disponibilizado pelo instrutor, talvez seja necessário baixar algum pacote usando o Composer:
composer update
  • Também pode ser um problema de configuração das extensões do PHP, recomendo você dra uma olhada neste tópico: Erro ao tentar php artisan migrate ( https://cursos.alura.com.br/forum/topico-erro-ao-tentar-php-artisan-migrate-84751) no fórum da Alura, onde o instrutor Vinicius Dias fala como resolver este tipo de problema.

  • Caso este problema tenha ocorrido depois de alguma alteração que você tenha feito no código ou nas configurações do seu PC, tenta retornar estas alterações e vê se funciona.

Espero que uma destas possíveis soluções ajude!

Olá, Ana. Você continua tendo esse problema?