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?
Estou me aprofundando em CakePhp e este artigo foi de grande ajuda.
Muito bom artigo. Eu curti.
O CakePHP me salva em vários lances. Coloca toda equipe focada numa regra em comum.
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)?
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.
Bem interessante.
Nunca havia testado, vou fazer isso assim que possível.