/** * Recupera uma lista de itens * * Permite tambem que sejam passados parametros adicionais, * onde o usuario praticamente pode fazer qualquer operacao, * como se estivesse trabalhando com os DAO's diretamente. * * Exemplode uso: * * <code> * # preferencias de pesquisa * $prefs = array( * # clausula having * 'having' => 'contador > 10', * # adiciona campos a selecao * 'selectAdd' => 'count(idpessoa) as contador', * # seleciona SOMENTE os campos abaixo * 'select' => 'c.campo1, c.campo2, p.campo1', * # agrupamento * 'group' => 'c.idcategoria', * # join * 'join' => array( * array( * 'class'=>'Categoria', # obrigatorio * 'alias'=>'c', # opcional, mas altamente recomendado * 'type'=>'inner', # obrigatorio * 'fieldFrom'=>'idCategoria', # opcional * 'fieldTo'=>'idCategoria', # opcional * 'extra' => 'c.status = ?', #opcional * 'extraArgs' => array(1) # opcional, utilizado em conjunto com o "extra", * ), * ), * * 'whereFilters' => array( # opcional, utilizado para alterar como os filtros where se comportam * 'o.idendereco' => ' > ?', * 'o.logradouro' => ' like ?', * 'l.numero' => ' in (?)' * ), * * 'whereExtra' => 'o.condicao > ?', # opcional * 'whereExtraArgs' => array(1000) # opcional * ); * * $filtros['p.nome'] = 'hugo'; * $filtros['c.idCategoria'] = 1; * $orderBy = 'p.nome asc, c.nome asc'; * $offset = 0; * $limit = 20; * * $results = PessoaModel::getInstance($filtros, $orderBy, $offset, $limit, $prefs); * * </code> * * @author Hugo Ferreira da Silva * @link http://www.hufersil.com.br * @param array $filters Filtros a serem usados * @param string $order Ordenacao dos resultados * @param int $offset Inicio dos resultados * @param int $limit Limite de itens * @param array $prefs Preferencias para busca * @return array Lista de itens encontrados */ public function find(array $filters = array(), $order = '', $offset = null, $limit = null, array $prefs = array()) { $this->obj->reset(); $this->obj->alias('o'); $this->obj->selectAs(); // se indicou uma lista de join's if (isset($prefs['join']) && is_array($prefs['join'])) { // para cada item foreach ($prefs['join'] as $item) { // faz o join $this->makeJoins($this->obj, $item); } } $this->setFilters($filters, array_key_exists('whereFilters', $prefs) ? $prefs['whereFilters'] : array()); // se definiu um whereExtra if (array_key_exists('whereExtra', $prefs) && !empty($prefs['whereExtra'])) { // se definiu argumentos extra if (array_key_exists('whereExtraArgs', $prefs) && !empty($prefs['whereExtraArgs'])) { // cria a listagem de argumentos em conjunto com o extra $args = array($prefs['whereExtra']); $args = array_merge($args, $prefs['whereExtraArgs']); // chama o metodo where por reflexao $method = new ReflectionMethod($this->obj, 'where'); $method->invokeArgs($this->obj, $args); // se nao definiu valores extras } else { $this->obj->where($prefs['whereExtra']); } } // conta os registros $this->rows = $this->obj->count(isset($prefs['countString']) ? $prefs['countString'] : '*'); // se informou o having if (isset($prefs['having'])) { $this->obj->having($prefs['having']); } // se informou group by if (isset($prefs['group'])) { $this->obj->group($prefs['group']); } // se informou select if (isset($prefs['select'])) { // se for um array if (is_array($prefs['select'])) { // une as colunas $this->obj->select(implode(', ', $prefs['select'])); // se for string } else { if (is_string($prefs['select'])) { $this->obj->select($prefs['select']); } } } // se informou uma ordem if (!empty($order)) { $this->obj->order($order); } // limita e executa a consulta $this->obj->limit($offset, $limit)->find(); return $this->obj->allToArray(); }