2010-12-22 92 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的消毒库,它有助于从注入和跨清理用户提供的数据现场脚本攻击。

相关问题