Pour ma part, j'utilise de plus en plus des vues SQL.
Je m'explique au départ, je m'embrouillait avec tout mes models et leurs relations et des containble à en plus finir.
L'avantage avec une vue c'est que tu peu combiner n'importe qu'elles de tes tables. Elle sera ensuite disponible sous CakePHP comme une seule table.
Un exemple d'une vue
SELECT Post.id, referenceID, content, created, modified, like_count, pin_count, comment_count, authorType, authorName, GROUP_CONCAT(tags.label) AS tags
FROM posts AS Post
JOIN
(SELECT posts_vendors.post_id, posts_vendors.store_id as referenceID, 'store' as authorType, stores.storename as authorName
FROM posts_vendors
JOIN stores ON posts_vendors.store_id = stores.id
UNION
SELECT posts_customers.post_id, posts_customers.user_id, 'customer', users.username
FROM posts_customers
JOIN users ON posts_customers.user_id = users.id) AS listName ON Post.id = listName.post_id
LEFT OUTER JOIN posts_tags ON Post.id = posts_tags.post_id
LEFT OUTER JOIN tags ON posts_tags.tag_id = tags.id
GROUP BY Post.id;
Cette simple requête SQL aura combiner 4 tables en une seul et unique table.
Dans le détails
Le premier SELECT correspond aux champs de ma vu:
=> Je peu ajouter autant de champs que je veux
=> Je peu les nommés indépendamment des champs des tables sources, ce qui compte c'est l'ordre d'apparution des colonnes dans chaque SELECT.
=> Respecter le nombres de colonnes à afficher dans chaque SELECT.
Je récupère tout les posts, ceux des vendeurs(posts_vendors) et ceux des clients(posts_customers).
Si c'est un vendeur, mon champs virtuel (authorType) prend 'store' ou 'customer' pour un client
Je récupère les tags de chacun de ces posts, que je concatène et j'obtient 'montag1, montag2' ou 'null' si le post n'a pas de tag.
Il ne me reste plus qu'à créer le model dans CakePHP pour cette vue, qui sera utiliser comme une table.
Par contre pour les sauvegarde ça se fait directement dans les tables.
Les vues sont en somme utilisé pour fait une synthése de tes tables.