Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Relacionamentos entre tabelas com o Eloquente no Laravel

Olá,

Apesar de ter gostado do curso de Laravel, acho que faltou detalhar um pouco mais a questão dos relacionamentos entre as tabelas no banco de dados.

Por exemplo como funciona a relação entre uma classe abstrata e suas concretas no framework? Eu tenho a classe PessoaJuridica:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class PessoaJuridica extends Model
{
        protected $table = 'cad_pessoa_juridica';
}

E tenho a classe Cliente (que é um tipo de pessoa jurídica):

<?php

namespace App\Cadastro;

use Illuminate\Database\Eloquent\Model;

class Cliente extends Model
{
        protected $table = 'cad_clientes';

        public function pessoa_juridica()
        {
                return $this->belongsTo('leme\Models\Empresa\PessoaJuridica');
        }
}

Eu fiz dessa forma e funcionou para os meus propósitos. Mas eu não queria poder instanciar a classe PessoaJuridica, e também gostaria que, quando fosse inserir ou alterar informações do Cliente no formulário, ele obrigatoriamente alterasse as informações da classe PessoaJuridica sem precisar chama-la explicitamente (se é que é possível).

No banco de dados, essas duas classes são tabelas diferentes.

Obrigado!

1 resposta
solução!

Oi Yharon, tudo bom?

Para que a classe PessoaJuridica não possa ser instanciada você vai precisar torna-la abstrata. Porém, o eloquent só vai persistir entidades concretas então você precisaria de alguma class que herdasse de PessoaJuridica pra poder persistir.

Além disso, o eloquent não trabalha muito bem com herança. Uma forma seria definir o atributo:

    protected $table = 'your_table';

Na classe mãe e nas classes filhas.

Uma alternativa é utilizar o Doctrine que é um ORM mais robusto baseado na JPA do java pra PHP que também integra com o laravel, e trabalhar com mapped super class.

Acredito que o foco do curso seja o framework em sí não os ORMs. Mas, se você quiser, pode sugerir um curso especifico do eloquent/doctrine aqui.

Abraço!