I have the following database model:
I'lldetailthereasonforsomepoints:
Thecustomerisrelatedtothepersonasitcanbeanindividualorcorporateclient.
Eachpersonmayormaynotbeassociatedwithanagency,astheideawouldbetodevelopthesysteminSaSformat,soeachagencywouldseecustomers,employees,suppliers,etc.belongingonlytoyou.
I'mworkingwithDoctrine2andAnnotations,andtheproblemIfoundrightnowis:
IhaveamiddlewarethatreturnsclientsandIneedtoaccesstheperson'snameorthephantomnameofthelegalentityaccordingtothetype(whichisinthepropertytype),butIcouldnotreachtoalogicalrationaleofhowthisdifferentiationwouldbedonethroughDoctrine.
AtthemomentI'mnotextendinganyclasssinceeachentityhasitsprimarykey.Usingtheperson'sprimarykeyandextendingEntitieswouldbeanoption?
MyentityclassesClient,Person,Person,andPersonJuridica:
Customer
classClienteimplements\JsonSerializable{use\Common\Traits\JsonSerializeTrait;/***@Id*@GeneratedValue(strategy="IDENTITY")
* @Column(type="integer", length=32, unique=true, nullable=false, name="id_cliente")
* @var integer
*/
private $idCliente;
/**
* @OneToOne(targetEntity="Pessoa")
* @JoinColumn(name="pessoa", referencedColumnName="id_pessoa")
* @var Pessoa
*/
private $pessoa;
/**
* Número do passaporte
* @Column(type="string")
* @var string
*/
private $passaporte;
/**
* Nacionalidade do cliente
* @Column(type="boolean", name="nacionalidade")
* @var boolean
*/
private $nacionalidade;
// Getters & Setters
}
Person
class Pessoa implements JsonSerializable
{
use JsonSerializeTrait;
/**
* @Id
* @GeneratedValue(strategy="IDENTITY")
* @Column(type="integer", length=32, unique=true, nullable=false, name="id_pessoa")
* @var integer
*/
private $idPessoa;
/**
* @Column(type="integer", length=1)
* @var type Tipo de pessoa, jurídica, física ou estrangeiro
*/
private $tipo;
/**
* Usuário
*
* @var User
*/
private $usuario;
/**
* @OneToOne(targetEntity="EnderecoPessoa", mappedBy="pessoa")
* @var EnderecoPessoa
*/
private $endereco;
/**
* Agência a qual a pessoa está associada
* @ManyToOne(targetEntity="Agencia", cascade={"all"}, fetch="LAZY")
* @JoinColumn(name="agencia", referencedColumnName="idAgencia")
* @var Agencia
*/
private $agencia;
/**
* Contatos da pessoa
* @OneToMany(targetEntity="ContatoPessoa", mappedBy="pessoa", cascade={"persist"}, orphanRemoval=true)
* @var ArrayObject|array
*/
private $contatos;
// Getters & Setters
}
PersonPhysical
class PessoaFisica extends Pessoa implements JsonSerializable
{
use JsonSerializeTrait;
/**
* Id da pessoa física
* @Id
* @GeneratedValue(strategy="IDENTITY")
* @Column(type="integer", length=32, unique=true, nullable=false, name="id_pessoa_fisica")
* @var integer
*/
private $idPessoaFisica;
/**
* @OneToOne(targetEntity="Pessoa")
* @JoinColumn(name="pessoa", referencedColumnName="id")
* @var Pessoa
*/
private $pessoa;
/**
* Nome da pessoa física
* @Column(type="string", length=14)
* @var string
*/
private $nome;
/**
* Número do CPF da pessoa (quando brasileiro)
* @Column(type="string", length=14)
* @var string
*/
private $cpf;
/**
* Número do RG (quando brasileiro)
* @Column(type="string", length=13)
* @var string
*/
private $rg;
/**
* Data de nascimento
* @Column(type="Date")
* @var DateTime
*/
private $dataNascimento;
// Getters & Setters
}
PersonalJuridica
class PessoaJuridica extends Pessoa implements JsonSerializable
{
use JsonSerializeTrait;
/**
* ID da pessoa jurídica
* @Id
* @GeneratedValue(strategy="IDENTITY")
* @Column(type="integer", length=32, unique=true, nullable=false, name="id_pessoa_juridica")
* @var integer
*/
private $idPessoaJuridica;
/**
* Pessoa associada a PJ
* @OneToOne(targetEntity="Pessoa")
* @JoinColumn(name="pessoa", referencedColumnName="id")
* @var Pessoa
*/
private $pessoa;
/**
* Nome fantasia
* @Column(type="string", length=32, name="nome_fantasia")
* @var String
*/
private $nomeFantasia;
/**
* Número do CNPJ
* @Column(type="string", length=14, unique=true, name="cpf_cnpj")
* @var string
*/
private $cnpj;
/**
* Razão social da empresa
* @Column(type="string", length=32, name="razao_social")
* @var string Razão social da empresa, quando necessário
*/
private $razaoSocial;
// Getters & Setters
}
PS: I accept suggestions about modeling too, if you think you need to improve (and judging by my difficulty in finding a logic you may well need it).