Model Layer with DAO classes

1

I work with an MVC application that can be considered large or at least average, since it involves hundreds of functionalities and more than 400 MySQL database tables. As an ORM tool we adopt Doctrine through dependency injection, and we choose to adopt the DAO (Data Access Object) standard for storing queries for each Entity class, that is, each table in the database has an Entity class that represents, and this in turn has a DAO class.

I do not know if this is normal, but the problem is that DAO classes are getting very large, some already have more than 30 methods where each represents a type of query or business rule.

We are trying to create the methods in a more specific and parameterized way as possible, in addition, all DAO classes are daughters of the AbstractDAO class, which already implements and makes available generic methods, such as insert , update , find , list , and others.

Do you suggest some technique, pattern or tool to be able to further condense the code, or at least organize it better?

Example of an EntityDAO class without implementing methods:

<?php

/**
 * Classe de modelo da entidade EstembalagemVolume
 *
 * @author Maycon Brito
 * @since 02/09/2014
 */
class EstembalagemVolumeDAO extends ModelDAO {

    /**
     * @override
     * @return \Doctrine\Entidades\EstembalagemVolume
     */
    public function getEntidade() {
        return new Doctrine\Entidades\EstembalagemVolume();
    }

    /**
     * Busca um determinado registro a partir do lote e do pálete do mesmo.
     * 
     * @param string $lote
     * @param string $palete
     * @return 
     */
    public function findPorLotePalete($lote, $palete) {

    }

    /**
     * Consulta os registros da tabela Estembalagem_volume a partir dos parâmetros especificados
     * 
     * @param int $idEtiqueta id da etiqueta do volume
     * @param int $idCre id do cre do volume
     * @return array os registros retornados pela consulta
     */
    public function listarPorEtiquetaCRE($idEtiqueta, $idCre) {

    }

    /**
     * Retorna os objetos EstembalagemVolume e os objetos EstoqueembalagemMapa relacionados ao
     * CR e à situação especificados por parâmetro.
     * 
     * @param int $anoCr número do ano do CR
     * @param int $codigoCr número do código do CR
     * @param int $qtdeCr número da quantidade do CR
     * @param string $situacao situação dos registros de EstembalagemVolume
     * @return array o resultado da consulta
     */
    public function listarEstoqueEmbalagemMapa($anoCr, $codigoCr, $qtdeCr, $situacao) {

    }

    /**
     * Busca no banco de dados os objetos de EstoqueembalagemVolume com innerjoin com a 
     * tabela FornecedoresCR, utilizando como parâmetros de busca o id da etiqueta do
     * volume e o código do fornecedorCr (idCr)
     * 
     * @param int $idEtiqueta id da etiqueta
     * @param int $idCr id do Cr ou simplesmente o atributo código da tabela fornecedores
     * @return array o resultado da query
     */
    public function listarComFornecedoresCr($idEtiqueta, $idCr) {

    }

    /**
     * Realiza a alteração do idLocal de um determinado registro de id $idVolume no banco de dados.
     * 
     * @param int $idVolume id do volume a ser alterado
     * @param int $idLocal idLocal a ser atualizado
     * @return \EstembalagemVolumeDAO
     */
    public function alterarLocal($idVolume, $idLocal) {

    }

    /**
     * Realiza a alteração da situação de um determinado registro de id $idVolume no banco de dados.
     * 
     * @param int $idVolume id do volume a ser alterado
     * @param string $situacao nova situação a ser atualizada no registro
     * @return \EstembalagemVolumeDAO
     */
    public function alterarSituacao($idVolume, $situacao) {

    }

    /**
     * Busca os objetos EstembalagemVolume que satisfaçam os parâmetros passados e retorna
     * a número de registros encontrados
     * 
     * @param int $anoCr o ano do cr
     * @param int $codigoCr o código do cr
     * @param int $qtdeCr a quantidade do cr
     * @param string $situacao a situação dos volumes
     * @return array o resultado da consulta
     */
    public function totalVolume($anoCr, $codigoCr, $qtdeCr, $situacao) {

    }

    /**
     * Lista os objetos EstoqueembalagemVolume de um determinado CRE e Etiqueta 
     * que estejam com situação BloqueioALME ou BloqueioLCME.
     * 
     * @param int $anoCr o ano do cr a ser consultado
     * @param int $codigoCr o código do cr a ser consultado
     * @param int $qtdeCr a quantidade do cr a ser consultado
     * @param int $idEtiqueta o id da etiqueta 
     * @return array o resultado da query
     */
    public function listarComBloqueio($anoCr, $codigoCr, $qtdeCr, $idEtiqueta) {

    }

    /**
     * Consulta registros do tipo EstembalagemVolume a partir do idLocal, realizando
     * inner join com registros de FonecedoresCr, Produtos e EstoqueembalagemMapa. 
     * 
     * @param int $idLocal idLocal do registro
     * @param string $tipoCr tipo do cr da tabela fornecedores_cr
     * @return array o resultado da consulta
     */
    public function listarJoinPorLocal($idLocal, $tipoCr) {

    }

    /**
     * Consulta registros do tipo EstembalagemVolume a partir do idLocal
     * 
     * @param int $idLocal idLocal do registro
     * @return array o resultado da consulta
     */
    public function listarDadosCrPorLocal($idLocal) {

    }

    /**
     * Busca o objeto relacionado ao id especificado por parâmetro
     * 
     * @param int $id id do objeto a ser consultado
     * @return object o objeto resultante da consulta
     */
    public function get($id) {

    }

    /**
     * Busca o objeto relacionado ao id especificado por parâmetro, porém
     * nesta consulta são realizados left joins com as tabelas estembalagem_volume,
     * fornecedores_cr e produtos, que sejam relacionados ao objeto encontrado.
     * 
     * @param int $id id do objeto a ser consultado
     * @return object o objeto resultante da consulta
     */
    public function getJoin($id) {

    }

    /**
     * Consulta registros EstembalagemMapa realizando inner join com os objetos
     * EstembalagemVolume e Situacao, para um determinado Cr especificado por parâmetro.
     * 
     * @param int $anoCr o ano do cr a ser consultado
     * @param int $codigoCr o código do cr a ser consultado
     * @param int $qtdeCr a quantidade do cr a ser consultado
     * @return array o resultado da query
     */
    public function listarComEstembalagemVolume($anoCr, $codigoCr, $qtdeCr) {

    }

    /**
     * Recupera no banco de dados os objetos Estoqueembalagem com innerJoin com
     * objetos dos tipos Produtos e FornecedoresCr, sendo do mesmo idCr do especificado
     * por parâmetro.
     * 
     * @param int $idCr id do Cr de fornecedores_cr
     * @return array o resultado da query
     */
    public function listarComProdutosFornecedoresCR($idCr) {

    }

    /**
     * Recupera no banco de dados os objetos Estoqueembalagem com innerJoin com
     * objetos dos tipos EstembalagemVolume, sendo do mesmo volume, anocr, codigocr, qtdecr do especificado
     * por parâmetro.
     * 
     * @param int $anoCr o ano do cr a ser consultado
     * @param int $codigoCr o código do cr a ser consultado
     * @param int $qtdeCr a quantidade do cr a ser consultado
     * @return array o resultado da query
     */
    public function listarComEstEmbalagemVolume($anoCr, $codigoCr, $qtdeCr, $idEtiqueta) {

    }

    /**
     * Recupera no banco de dados os objetos Estoqueembalagem com innerJoin com
     * objetos dos tipos Produtos e Funcionarios, sendo do mesmo codigoproduto, responsável e empresaresponsavel
     * com leftjoin com objetos dos tipos Observacaoembalagem, sendo do mesmo codigomovimento
     * por parâmetro.
     * 
     * @return array o resultado da query
     */
    public function listarComProdutosFuncionariosObservacaoEmbalagem() {

    }

    /**
     * Realiza a alteração do tipo movimento de um determinado registro de id $idVolume no banco de dados.
     * 
     * @param int $idVolume id do volume(codigomovimento) a ser alterado
     * @param string $tipomovimento novo tipo movimento a ser atualizada no registro
     * @return \EstoqueEmbalagem
     */
    public function alterarTipoMovimento($idVolume, $tipomovimento) {

    }

    /**
     * Realiza a alteracao do crencerrado de um registro de $anocr, $codigocr, $qtdecr, $cod_produto no banco de dados
     * 
     * @param int $anoCr ano do Cr da embalagem a ser alterada
     * @param int $codigoCr codigo do Cr da embalagem a ser alterada
     * @param int $qtdeCr quantidade do Cr da embalagem a ser alterada
     * @param int $codigoProduto codigo da embalagem a ser alterada
     * @return \EstoqueEmbalagem
     */
    public function alterarCrEncerrado($anoCr, $codigoCr, $qtdeCr, $codigoProduto) {

    }

    /**
     * Realiza a alteração da data movimento de um determinado registro de id $idVolume no banco de dados.
     * 
     * @param int $idVolume id do volume a ser alterado
     * @param date $datamovimento nova data movimento a ser atualizada no registro
     * @return \EstoqueEmbalagem
     */
    public function alterarDataMovimento($idVolume, $datamovimento) {

    }

    /**
     * Recupera no banco de dados os objetos Estoqueembalagem 
     * 
     * @param int $anoCr o ano do cr a ser consultado
     * @param int $codigoCr o código do cr a ser consultado
     * @param int $qtdeCr a quantidade do cr a ser consultado
     * @param int $numVolume o número do volume a ser consultado
     * 
     * @return array o resultado da query
     */
    public function listaIdEstoqueEmbalagem($anoCr, $codigoCr, $qtdeCr, $numVolume) {

    }

}
    
asked by anonymous 06.11.2014 / 11:48

1 answer

1

I think about DAO it's okay. Try to implement more business layers BL (Business Layers) Layers of domain entities. Some helpers if you need duplicate codes and methods.

Avoid using many third-party technologies and ddl's.

Always remember. Less is more! The less you write (as long as it's quality), the easier your code will be.

    
06.11.2014 / 11:53