0

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 ..

  1. ipad (dans 3 tags)
  2. BB (trouvé en 2 tags)
  3. 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.

Répondre

0

Si le résultat de ce sql n'utilise pas la pagination (en supposant que les produits associés dans une page Web normale sont 3-5 entrées) pourquoi n'utilisez-vous pas ce SQL complexe à la place?

-à-dire créer une relatedProducts de fonction() dans votre modèle de produit

puis utilisez $ this-> query ($ sql)

exemple de code sera:

class Product extends AppModel { 
    //.. 
    var $hasAndBelongsToMany = array("Tag"); 
    //.. 
    function relatedProducts($parameters){ 
    $sql = "select..... where ....$parameters..."; 
    return $this->query($sql); 
    } 
} 

vous pouvez utiliser dans le contrôleur par

$this->Product->relatedProducts($some_parameters); 
Questions connexes