1
resposta

Models e Herança no Laravel

Boa tarde!

Estou tentando criar uma model que estende uma model pai (classe pessoafisica estende a classe pessoa), a fim de fazer uma consulta que retorne dados que envolvam as 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 para utilizar na condição "where". Enfim, quero fazer uma consulta no Eloquent com a classe filha que tenha na condição (where) o campo 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.
}
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 "nome" 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

1 resposta

Olá, Marcelo! Tudo bem?

No Laravel, quando você está trabalhando com herança de modelos usando o Eloquent, é importante lembrar que cada modelo geralmente corresponde a uma única tabela no banco de dados. Se você está tentando fazer uma herança onde PessoaFisica estende Pessoa, você precisa garantir que ambos os atributos de Pessoa e PessoaFisica estejam na mesma tabela ou ajustar como você está acessando os dados.

Pelo que você descreveu, parece que você quer que PessoaFisica tenha acesso aos campos de Pessoa. Uma maneira de fazer isso no Laravel é garantir que os campos da classe pai (Pessoa) sejam incluídos no array $fillable da classe filha (PessoaFisica). No entanto, você precisa fazer isso manualmente, como no exemplo abaixo:

namespace App\Models;

class PessoaFisica extends Pessoa
{
    protected $fillable = ['nome', 'endereco', 'cpf']; // Inclua todos os campos necessários aqui
}

Além disso, certifique-se de que a tabela no banco de dados que está sendo usada por PessoaFisica contém todas as colunas necessárias (nome, endereco, cpf, etc.). Se PessoaFisica está usando uma tabela diferente de Pessoa, você precisará ajustar sua migração para refletir isso, ou usar uma abordagem de tabela única com um discriminador de tipo, se estiver tentando implementar um padrão de herança de tabela única.

Se você estiver usando tabelas separadas para Pessoa e PessoaFisica sem um campo discriminador, você provavelmente precisará ajustar sua abordagem para usar relacionamentos em vez de herança. Por exemplo, você poderia ter Pessoa como uma tabela/modelo base e PessoaFisica como uma tabela/modelo que tem uma relação belongsTo com Pessoa.

Aqui está um exemplo de como você poderia ajustar os modelos para usar relacionamentos:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Pessoa extends Model
{
    protected $fillable = ['nome', 'endereco'];

    public function pessoaFisica()
    {
        return $this->hasOne(PessoaFisica::class);
    }
}

class PessoaFisica extends Model
{
    protected $fillable = ['cpf'];

    public function pessoa()
    {
        return $this->belongsTo(Pessoa::class);
    }
}

E então, ajustar sua consulta para algo como:

use App\Models\PessoaFisica;

$pessoas = PessoaFisica::with('pessoa')
                        ->whereHas('pessoa', function ($query) {
                            $query->where('nome', 'João');
                        })
                        ->where('cpf', '123.456.789-00')
                        ->get();

Espero que essas sugestões ajudem a resolver o problema que você está enfrentando e bons estudos!

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

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