Je veux suggérer des produits apparentés par tags et trier par les plus recherchés.CakePHP sous-requête SQL dans HABTM relation
l'association modèle HABTM entre le produit et Tag
class Product extends AppModel {
//..
var $hasAndBelongsToMany = array("Tag");
//..
}
et vice versa dans le modèle Tag. le nom de la table jointe est également "products_tags".
pour Ex.sample ..
//just sample of Product contain Tag data
$products[0]['Tag'] = array('touch', 'phone', '3G', 'apple'); //iPhone
$products[1]['Tag'] = array('phone', '3G', 'BB'); //BB
$products[2]['Tag'] = array('touch', '3G', 'apple'); //iPad
$products[3]['Tag'] = array('3G', 'air card'); //3G air card
dans cet échantillon sorte le plus lié à l'iPhone par priorité sont ..
- ipad (dans 3 tags)
- BB (trouvé en 2 tags)
- aircard (1 seulement en correspondance)
Comment la manière de gâteau à l'aide du modèle find() pour obtenir des sous-requête comme ceci:
SELECT DISTINCT (product_id) AS id, (
/* sub-query counting same tags*/
SELECT COUNT(*) FROM tags as Tag
LEFT JOIN products_tags AS ProductTag ON (Tag.id = ProductTag.tag_id)
WHERE product_id = id
AND Tag.name IN ('touch', 'phone', '3G', 'apple')
) AS priority /*this is weight count by how many same tags*/
FROM `tags` as Tag
LEFT JOIN products_tags AS ProductTag ON (Tag.id = ProductTag.tag_id)
WHERE Tag.name
IN ('touch', 'phone', '3G', 'apple')
ORDER BY priority DESC
requête SQL ci-dessus retour exactement ce que je avais besoin. mais je ne trouve pas le moyen d'analyser les paramètres de la méthode AppModel-> find() de CakePHP.