Model layer with DAO classes

Asked

Viewed 805 times

1

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

I don’t know if this is normal, but the problem is that the DAO classes are getting too big, in some we already have more than 30 methods where each one represents a kind of consultation or business rule.

We are trying to create the methods more specifically and parameterized as possible, moreover, all DAO classes are daughters of the class AbstractDAO, that already implements and makes available generic methods, such as Insert, update, find, list, and others.

You suggest to me some technique, pattern or tool to be able to condense the code even more, or at least to organize it better?

Example of a class Entity without the implementation of 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) {

    }

}
  • You could post at least one of these classes that you consider great?

  • @Brunoaugusto I will post one of these DAO, but I will omit the business rule, IE, I will post only the declaration of methods.

1 answer

1

I think DAO’s okay. Try implementing more BL business layers ( 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 is more! The less you write( as long as it’s quality ), the easier your code maintenance will be.

  • Thank you @Johnathan. Would these BL’s be created in other classes in the template layer? That is, the model layer in addition to the Entity and Entity classes would also have Entidadebl?

Browser other questions tagged

You are not signed in. Login or sign up in order to post.