Lors d'une association telle que hasMany, il est parfois souhaitable de placer des conditions de recherche sur les données associées. Ceci n'est pas faisable directement.

Prenons par exemple un modèle Post ayant beaucoup de Commentaires. Nous souhaitons récupérer tous les Posts où Fred a posté un commentaire.

Avec le snippet suivant, nous allons utiliser un faux champ 'auteur_commentaire' dans nos conditions et dynamiquement faire le travail pour ne retourner que les résultats souhaités.

function beforeFind($query) {

	$auteur_commentaire = false;
	if (isset($query['conditions']['auteur_commentaire'])) {
		$supplier = $query['conditions']['auteur_commentaire'];
		unset($query['conditions']['auteur_commentaire']);
	} elseif (isset($query['conditions'][$this->alias . '.auteur_commentaire'])) {
		$supplier = $query['conditions'][$this->alias . '.auteur_commentaire'];
		unset($query['conditions'][$this->alias . '.auteur_commentaire']);
	}
	if ($auteur_commentaire) {
		$postIds = $this->Commentaire->find('list', array('conditions' => array('Commentaire.auteur' => $auteur_commentaire), 'fields' => array('id', 'post_id')));
		$query['conditions'][$this->alias . '.id'] = $postIds;
	}
	
	return $query;
}

Concrètement nous analysons si la condition auteur_commentaire existe. Si oui, récupérons tous les IDs de posts associés à cet auteur dans la table des commentaires. Ensuite nous rajoutons à notre recherche initiale la condition stipulant les IDs possibles pour les Post. Ceci fait en toute transparence dans votre modèle.

Attention toutefois qu'en terme de performance cela peut devenir une grosse requête lorsqu'il y a plusieurs dizaines de milliers de post associés.