No CakePHP 1.2, ficou mais fácil retornarmos do nossos modelos apenas aquilo o que realmente esperamos, no core do CakePHP 1.2, foi adicionado o behavior Containable, o qual se propõem, a filtrar o relacionamentos entre os modelos no CakePHP.
Com este, conseguimos quando fazemos retrive em algum modelo, fazer com que ele traga justamente aquilo que achamos pertinente, ou seja, apenas o resultado desejado, com isso poupando dados redundantes, assim como melhorando a performance por o modelo deixar, de trazer relacionamentos que não são necessários.
O uso do mesmo no CakePHP, é muito simples, basta chamar ele no modelo, que julga pertinente, ou adicionar no AppModel para que todos os modelos herdem esse behavior, Countaible.
1
2
3
| class AppModel extends Model {
public $actsAs = array('Containable');
} |
ou on the fly:
1
| $this->Modelo->Behaviors->attach('Containable'); |
Após a importação seu uso é simples, imaginamos um ambiente onde temos os seguintes modelos:
Post, User, Comment, Tag, onde:
1
2
3
| Post belongsTo User
Post hasMany Comment
Post hasAndBelongsToMany Tag |
Agora supúnhamos que desejamos fazer uma listagem dos últimos posts, logo só precisamos exibir os dados, do Post, o User que escreveu esse Post e as Tags desse post.
1
2
| $this->Post->contain('User','Tag');
debug($this->Post->find('all', array('limit' => 10))); |
outro exemplo:
1
| $this->Post->contain('Comment.author = "Gabriela"'); |
Com isso filtramos os resultados que o find do Post deve trazer, isso pode ser feito com diversos relacionamentos:
1
2
| $this->User->contain('Profile', 'Scrap', 'Scrap.User', 'Album.Photo');
$this->User->find('all'); |
Conseguimos definir os relacionamentos entre os modelos que desejamos trazer, é uma boa alternativa para o:
1
| $this->Modelo->recursive |
Resumindo o Containable é sempre uma grande opção, na ora de usar o find, pois com eles conseguimos definir exatamente o que desejamos que o find traga para nós.