0

가장 관련성이 높은 태그 및 정렬 순서로 관련 제품을 제안하고 싶습니다.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 개 태그에 있음)

  1. 아이 패드
  2. BB (2 태그에)
  3. 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를 파싱하는 방법을 찾을 수 없습니다.

답변

0

이 sql의 결과가 페이지 매김을 사용하지 않는 경우 (일반 웹 페이지의 관련 제품이 3-5 항목이라고 가정 할 때) 대신이 복잡한 SQL을 사용하지 마십시오.

다음 $ this-> 쿼리 ($의 SQL)를 사용하여 제품 모델의 기능 relatedProducts()를 만들

샘플 코드는 다음과 같습니다

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

그런 다음 당신이 사용할 수있는 그것 컨트롤러에 의해

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