CakePHP Logo

Criando um novo tipo de find() no CakePHP 2.0

Recentemente comecei a trabalhar num projeto onde a maior parte dos models tem um campo “published”, que servirá para controlar qual conteúdo entra ou não no site externo… E eu não acho muito prático ficar colocando "published" => true em todas as conditions do site.

Foi aqui que tive a idéia de criar o $Model->find('published'), que funciona da mesma forma que o $Model->find('all') mas inclui a condição internamente.

A documentação é bem simples, e o resultado da minha implementação (que estou usando no meu projeto) é mais ou menos assim:

A lógica é bem simples.. precisamos:

  1. Definir um método chamado “_findPublished” que será rodado antes e depois da consulta
  2. Retornamos os resultados encontrados caso ele tenha sido executado após a consulta ($state == after)
  3. Verificamos se o model tem uma coluna “published” e, caso tenha, incluímos a condição na $query

Agora eu posso buscar apenas os posts publicados de uma forma bem mais padronizada e elegante: $this->Post->find('published');

O método escapeField(field) (doc) recebe um nome de coluna e retorna no formato Model.coluna, no meu exemplo ficaria algo como Post.published.

Com isso você pode criar vários tipos de find, como por exemplo: $Model->find('active'), $Model->find('inactive') ou até $Model->find('urgent'), manipulando as condições extras internamente e deixando a sua aplicação muito mais organizada.

Não se esqueça que você pode criar um tipo de find pra todos os models (no AppModel) ou pra apenas um model, dentro dele.

E aí, gostou? :)

5 thoughts on “Criando um novo tipo de find() no CakePHP 2.0

  1. Renato

    Show de bola, Thiago. Só tenho uma dúvida. Como essa consulta seria rodada por todos os models, não seria melhor usar $this->Post->findByPublished(true)?

  2. Osmar Alves

    Se gostei… vai me ajudar muito no sistema que estou desenvolvendo. Eu estava criando métodos dentro do model assim => $this->Customer->owners(), mas dessa outra maneira irá ficar muito melhor.

Comments are closed.