3
respostas

Laravel 9 - Herança de Models

Boa tarde!

Estou tentando criar uma model que estende uma model pai, a fim de fazer uma consulta que retorne dados das duas classes. Todavia, ao tentar fazer a consulta no Eloquent com a classe filha, os atributos da classe pai não estão disponíveis. Enfim, quero fazer uma consulta no Eloquent com a classe filha que tenha na condição (where) os campos da classe pai, que deveriam ter sido herdados automaticamente.

Segue extrato do código de definição das classes:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
class Pessoa extends Model
{
    protected $fillable = ['nome', 'endereco'];

    // Outros métodos, relações, etc.
}
namespace App\Models;

class PessoaFisica extends Pessoa
{
    protected $fillable = ['cpf']; // Atributos adicionais da classe filha

    // Outros métodos, relações, etc.
}

Face do exposto, é possível realizarmos herança nas Models no Laravel ou devido ao fato do Eloquent ser baseado no Active Record, não é possível herança em Models e para fazer o que eu quero, eu deveria considerar que são dois models distintos e não usar herança?

Obrigado desde já!

Att., Marcelo Mendonça

3 respostas

Olá, Marcelo! Tudo bem?

Seu entendimento está correto, a herança de classes é uma característica da orientação a objetos e deveria funcionar neste caso. No entanto, o Laravel Eloquent tem algumas peculiaridades que podem estar causando o problema.

Por padrão, o Laravel Eloquent, associa uma model a uma tabela específica no banco de dados. Quando você estende uma model, o Eloquent ainda associa a model filha à mesma tabela que a model pai. Isso pode causar problemas se você estiver tentando usar a model filha para acessar dados que estão em uma tabela diferente.

Para resolver este problema, você pode tentar definir a propriedade $table na model filha para especificar a tabela correta. Aqui está um exemplo de como você pode fazer isso:

namespace App\Models;

class PessoaFisica extends Pessoa
{
    protected $table = 'pessoas_fisicas'; // A tabela correta no banco de dados
    protected $fillable = ['cpf']; // Atributos adicionais da classe filha

    // Outros métodos, relações, etc.
}

No entanto, é importante notar que a herança de classes pode não ser a melhor solução para este problema. Dependendo da estrutura do seu banco de dados e das relações entre suas tabelas, pode ser mais apropriado usar relações Eloquent, como hasOne, hasMany, belongsTo, etc.

Por exemplo, se uma Pessoa pode ser uma PessoaFisica, talvez seja melhor definir uma relação hasOne entre Pessoa e PessoaFisica. Assim, você poderia acessar os dados de PessoaFisica através da instância de Pessoa.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Boa tarde!

Na verdade eu queria fazer isso aqui:

use App\Models\PessoaFisica;

$pessoas = PessoaFisica::where('nome', 'João')
                        ->where('cpf', '123.456.789-00')
                        ->get();

Ou seja, fazer uma consulta que tivesse uma condição utilizando o atributo cpf da classe pai como se fosse da classe filha PessoaFsica, visando à herança do atributo na classe filha. Todavia, pelo que observei, o eloquent não permite esse tipo de consulta.

Obrigado desde já!

Att., Marcelo

Poderia tirar a dúvida acima??