2010-12-20 205 views
0

如果我想創建一個類別,並能夠通過標籤的產品鏈接到它,我可以像這樣:的CakePHP HABTM關聯規則

  • 創建類別和產品 表。
  • 與像標籤創建標籤表: 紅寶石,耳環,白金
  • 創建category_tagsproduct_tags
  • 設置的類別和產品
  • 設置標籤映射他們 hasAndBelongsToMany標籤 hasAndBelongsToMany products and hasBandongsToMany categories

現在說我有2個產品一個帶有標籤:Ruby耳環,另一個標籤:紅寶石手鍊

說我想創建一個紅寶石耳環類別。

我可以加上紅寶石耳環該標籤的分類。但是,在正常的HABTM Model協會下,兩種產品都將被退回,因爲即使只有1個標籤有earrings標籤,它們也都有ruby標籤。

我該如何才能使其只匹配具有與該類別相同的所有標籤(產品可以有更多標籤但必須具有相應類別所有標籤)的產品才能返回?

此外,如果進一步考慮,我怎樣才能將-tags添加到產品不能返回這些標籤的類別?

回答

0

下面的腳本解決了我的問題的產生,像這樣的查詢:

PHP

$data = $this->Designer->find(
    'first', 
    array(
     'conditions' => array(
      'Designer.slug' => $name, 
      'Designer.available' => 1 
     ) 
    ) 
); 

$inc_tag_ids = array(); 
$exc_tag_ids = array(); 
foreach($data["Tag"] as $tag) 
{ 
    if($tag['DesignersTag']['include']) 
    { 
     $inc_tag_ids[] = $tag['id']; 
    } 
    else 
    { 
     $exc_tag_ids[] = $tag['id']; 
    } 
} 

$ins = ' '; 

if(count($inc_tag_ids)) 
{ 
    $inc_tag_id_str = '"' . implode('","',$inc_tag_ids) . '"'; 
    $ins .= 'AND tags.id IN ('.$inc_tag_id_str.')'; 
} 

if(count($exc_tag_ids)) 
{ 
    $exc_tag_id_str = '"' . implode('","',$exc_tag_ids) . '"'; 
    $ins .= 'AND products.id NOT IN (
     SELECT products.id 
     FROM products, products_tags, tags 
     WHERE products.id = products_tags.product_id 
     AND tags.id = products_tags.tag_id 
     AND tags.id IN ('.$exc_tag_id_str.') 
    )'; 
} 

$prod_qry = ' 
    SELECT *, COUNT(DISTINCT tags.name) AS uniques 
    FROM products, products_tags, tags 
    WHERE products.id = products_tags.product_id 
    AND tags.id = products_tags.tag_id 
    '.$ins.' 
    GROUP BY products.id 
    HAVING uniques = '.count($inc_tag_ids).' 
'; 

echo $prod_qry; 

$data["matching_products"] = $this->Designer->Tag->query($prod_qry); 

SQL

SELECT * , COUNT(DISTINCT tags.name) AS uniques 
FROM products, products_tags, tags 
WHERE products.id = products_tags.product_id 
AND tags.id = products_tags.tag_id 
AND tags.id 
IN (
"8" 
) 
AND products.id NOT 
IN (

SELECT products.id 
FROM products, products_tags, tags 
WHERE products.id = products_tags.product_id 
AND tags.id = products_tags.tag_id 
AND tags.id 
IN (
"7" 
) 
) 
GROUP BY products.id 
HAVING uniques =1 

但是我覺得這不是CakePHP的是inteded的方式被對待,我想也許這應該在模型中處理,而不是在控制器中處理。但我不知道該怎麼做。