A vrai dire il y a plusieurs manières de faire, et il n'y a pas de "meilleure solution", tout dépend en fait de l'architecture globale de ton application.
La première, c'est de faire une boucle et de charger les données de plusieurs modèles "proprement".
L'avantage, c'est que cela te donne un libre accès à la méthode Model::find(), et donc d'utiliser des conditions, des contain etc, comme tu le ferais pour n'importe quel find.
L'inconvénient c'est que ça peut être lourd, puisque pour chaque model, tu auras au moins une requête qui partira, peut être plus si tu as des contain. Et avec cette méthode, tu ne récupères pas les 3 dernières activités de ton site, tu récupères simplement les n derniers enregistrements de chaque model, et c'est à toi de voir lesquels afficher.
Le code pourrait ressembler à ça :
$models = array('Actu', 'Book', 'Post', 'Store', 'Video');
$results = array();
foreach($models as $model) {
$this->loadModel($model);
$results$model] = $this->{$model}->find('all', array(
'conditions' => array(
$model'.pusblished' => true // Ceci est un exemple de condition, pour ne récupérer que les éléments publiés
),
'limit' => 5 // Ainsi tu récupères 5 éléments de chaque model
));
}
La seconde méthode, c'est d'utiliser du JOIN ou de l'UNION. D'ailleurs, l'UNION serait préférable puisque ta condition va donc se porter sur le created et sera partagée pour toutes les tables.
L'avantage de cette méthode, c'est qu'il n'y a qu'une requête qui part.
L'inconvénient, c'est que tu dois la construire à la main si tu te tournes vers UNION. Avec Join, tu peux faire ça avec un find, mais ça demande quand même pas mal d'ajustements (comme dans l'exemple ici : http://stackoverflow.com/questions/3536107/union-syntax-in-cakephp).
La troisième méthode n'est valable que si tu as des tables aux architectures relativement similaire, à l'exception de quelques champs spécifiques.
Admettons que pour chacun des models que tu as présenté tu aies une structure du type : id, name, slug, created, updated ; l'idée serait alors de faire un système à la Wordpress ou au polymorphic de Ruby on Rails : une seule table à la structure étendue qui est utilisée par plusieurs models.
Sur Cake, c'est déconseillé parce que mal géré en natif, mais il y a tout de même des manières de faire.
Par exemple, admettons que tu aies une unique table "posts", et un model post. Si demain tu dois étendre cette table à un second model, tu ajoutes une colonne "type", et après tu définis tes valeurs, du genre 0 => Post, 1 => Actu, 2 => Book, etc.
D'ailleurs, tu dois pouvoir gérer cet enum des différents types dans ton AppModel.
Ensuite, c'est un peu d'adaptation dans chacun des models qui hérite de post :
class Book extends AppModel {
var $useTable = 'posts';
function beforeFind($queryData) {
// Ici, tu dois surcharger le param conditions des query.
// Il faut faire des find avec une condition "type => 2", puisqu'on est sur Book.
}
function beforeSave() {
// Ici tu dois surcharger les datas qui sont save pour toujours passer le type à 2.
// Même principe que pour le find.
}
}
Voila. Donc tout dépend d'où tu en es dans ton application, de ton expertise en SQL et de la maintenabilité que tu souhaites obtenir.