Example #1
0
 /**
  * Efetua pesquisa parametrizada.
  *
  * Se informado, o segundo parâmentro $limit define o numero de resultado que será retornado. O terceiro parâmentro
  * $offSet que também é opcional define o registro inicial que sera contato o limite
  *
  * @param ValueObjectAbstract $valueObject
  * @param integer $limit
  * @param integer $offSet
  * @return Persist
  * */
 public function findByParam(ValueObjectAbstract $valueObject, $limit = NULL, $offSet = 0)
 {
     $annon = $this->_persist->annotation()->load();
     # filtro de pesquisa
     $tmpFilter = NULL;
     # esta tecnica foi empregada para definir que o primeiro operador deve ser um WHERE
     # e os demais um AND sem ficar efetuando um IF/ELSE a cada passada do foreach
     $tmpOperator = array('WHERE', 'AND');
     # recupera a query basica de pesquisa
     $tmpQuery = self::_buildBasicQuery($annon);
     # inicializa os parametros
     $params = NULL;
     # REGRA: extra filtros do valueObject, cada um dos campos contendo valor diferente de nulo
     # sera usado como paramento
     foreach ($annon->attrs as $field) {
         # verifica na anotacao se existe referencia do atributo para banco de dados
         if (!isset($field->database)) {
             // @codeCoverageIgnoreStart
             continue;
             // @codeCoverageIgnoreEnd
         }
         # recupera o nome do metodo acessor que recupera o valor do atributo no valueObject
         $get = $field->get;
         $value = $valueObject->{$get}();
         # se value for um valueObject entao busca pelo metodo de mesmo nome soh que valueObject
         if ($value instanceof ValueObjectAbstract) {
             $value = $value->{$get}();
         }
         # o campo so entra para relacao de filtros se for avaliado como diferente de NULL
         # informe a string 'NULL' para informar um filtro NULL
         if (NULL == $value) {
             // @codeCoverageIgnoreStart
             continue;
             // @codeCoverageIgnoreEnd
         }
         $params[$field->database] = self::_getValue($valueObject, $field->get, $field->type);
         $tmpFilter .= sprintf(' %1$s %2$s = :%2$s', $tmpOperator[(bool) $tmpFilter], $field->database);
     }
     # neste ponto deve ser verificao se eh para permitir a execucao de pesquisa completa,
     # ou seja, sem que nenhum filtro seja aplicado
     if (NULL == $tmpFilter) {
         # verificar com o marcone se eh para permitir
     }
     # alica o filtra ao consulta
     $tmpQuery .= $tmpFilter;
     return $this->_persist->getConnect()->prepare($tmpQuery, $params)->retrieve();
 }