How to implement the following template with Doctrine 2

0

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).

    
asked by anonymous 30.10.2018 / 23:24

0 answers