我想通过最匹配的标签和排序顺序来推荐相关产品。
产品与标签之间的HABTM模型关联
class Product extends AppModel {
//..
var $hasAndBelongsToMany = array("Tag");
//..
}
Tag模型中的反之亦然。 join-table name也是“products_tags”。
for 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
在此示例中,与iPhone按优先级排序最相关的是..
Cake如何使用Model find()来获取这样的子查询:
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
上面的SQL查询完全返回我需要的内容。但我找不到解析CakePHP的AppModel-> find()方法的方法。
答案 0 :(得分:0)
如果此sql的结果不使用分页(假设普通网页中的相关产品是3-5个条目),为什么不使用这个复杂的SQL呢?
即。在您的产品模型中创建一个与函数相关的产品()
然后使用$ this-> query($ sql)
示例代码将是:
class Product extends AppModel {
//..
var $hasAndBelongsToMany = array("Tag");
//..
function relatedProducts($parameters){
$sql = "select..... where ....$parameters...";
return $this->query($sql);
}
}
然后你可以通过
在控制器中使用它$this->Product->relatedProducts($some_parameters);