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:
- Definir um método chamado "_findPublished" que será rodado antes e depois da consulta
- Retornamos os resultados encontrados caso ele tenha sido executado após a consulta ($state == after)
- 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? :)