2010-12-22 38 views
0

首先讓我注意到我是MVC框架的新手,所以不要假設在這方面有任何知識。如何告訴模型如何找到其相關模型?

我有一個設計器模型,當我從設計器模型中檢索信息時,我想爲每個設計器拉動相關的產品

該協會並不簡單,所以蛋糕不會神奇地爲我做,所以我需要自己定義這個。我一直在跟隨教程,我認爲我很接近但不確定如何將它們結合在一起。

我有一個很長的查詢,如果你在正確的位置插入designer_id,它會選擇所有關聯的產品。

我想我應該把這個查詢放在Designer模型的某個地方,以便它知道如何檢索產品。

下面是該查詢,需要與designer_id替換字符串看起來像{$__cakeID__$}部分:

SELECT *, COUNT(DISTINCT tags.name) AS uniques 
FROM products, products_tags, tags, designers, designers_tags 
WHERE products.id = products_tags.product_id 
AND tags.id = products_tags.tag_id 
AND tags.id IN (
    SELECT t.id 
    FROM tags t 
    LEFT JOIN designers_tags dt ON dt.tag_id = t.id 
    LEFT JOIN designers d ON d.id = dt.designer_id 
    WHERE d.id ={$__cakeID__$} 
    AND dt.include =1 
) 
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 (
     SELECT t.id 
     FROM tags t 
     LEFT JOIN designers_tags dt ON dt.tag_id = t.id 
     LEFT JOIN designers d ON d.id = dt.designer_id 
     WHERE d.id ={$__cakeID__$} 
     AND dt.include =0 
    ) 
) 
AND designers.id = designers_tags.designer_id 
AND designers_tags.tag_id = tags.id 
GROUP BY products.id 
HAVING uniques = (
    SELECT COUNT(d.id) AS tag_count 
    FROM tags t 
    LEFT JOIN designers_tags dt 
     ON dt.tag_id = t.id 
    LEFT JOIN designers d 
     ON d.id = dt.designer_id 
    WHERE d.id = {$__cakeID__$} 
    AND dt.include =1 
    GROUP BY d.id 
) 

而且,這裏是設計師型號:

class Designer extends AppModel 
{  
    var $name = 'Designer'; 

    var $actsAs = array('Sluggable' => array('separator' => '-', 'overwrite' => false, 'label' => 'name')); 

    var $hasAndBelongsToMany = 'Tag'; 

    var $hasOne = 'AlternateName'; 

    var $hasMany = 'Vote'; 
} 

會是什麼我需要做的是讓Designer模型使用這個查詢來自動找到它的關聯產品?

+0

這是一個helluva查詢。你確定Cake不能爲你處理這個關聯嗎?你能描述一下這個關聯,並且/或者準確地描述你想從數據庫返回的內容? – Stephen 2010-12-22 18:16:28

+0

@Stephen,設計師HABTM標籤,產品HABTM標籤。包含了所有標籤作爲設計者的產品。此外,designers_tags表具有一個名爲`include`的布爾字段(如果爲false),則不應包含具有這些標籤的任何產品。這樣,我可以創建一個類別,並選擇產品必須或不應具有哪些標籤才能包含在該類別中。合理? – 2010-12-22 18:20:46

回答

0

這個查詢應該工作使用即席連接與中可容納的行爲:

// this assumes you are in the DesignersController 
$this->Designer->Tag->find('all', array(
    'joins' => array(
     array(
      'table' => 'designers_tags', 
      'alias' => 'FilterDesignersTag', 
      'type' => 'INNER', 
      'conditions' => array(
       'FilterDesignersTag.tag_id = Tag.id' 
      ) 
     ) 
    ), 
    'contain' => array('Designer', 'Product'), 
    'conditions' => array(
     'FilterDesignersTag.designer_id' => $designer_id, 
     'FilterDesignersTag.include' => 1 
    ) 
)); 

的數據將周圍的標籤回來導向,但你會得到你所需要的。另外,您需要確保在所有三種模型中定義HABTM關係,即DesignerProductTag(標記應該有兩個HABTM關聯)。

此外,您需要將var $actsAs = array('Containable');添加到您的模型。

編輯

如果你不能找到一個解決方案的CakePHP,並最終需要使用原始查詢,CakePHP的可以與模型query method做到這一點。理解你在使用這種方法時放棄了一些功能。另外要注意這個建議從食譜:如果你曾經使用你的應用這種方法

,一定要檢查出CakePHP的消毒庫,它有助於從注入和跨清理用戶提供的數據現場腳本攻擊。