가장 관련성이 높은 태그 및 정렬 순서로 관련 제품을 제안하고 싶습니다.CakePHP 하위 쿼리 HABTM 관계의 SQL
태그 모델의 제품 및 태그
class Product extends AppModel {
//..
var $hasAndBelongsToMany = array("Tag");
//..
}
그 반대의 HABTM 모델 협회. 또한 조인 테이블 이름은 "products_tags"입니다. 발견 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
종류의 우선 순위에있는 아이폰에 가장 관련 .. (3 개 태그에 있음)
- 아이 패드
- BB (2 태그에)
- aircard (단 1 개만 일치)
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() 메소드에 params를 파싱하는 방법을 찾을 수 없습니다.