首先让我注意到我是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模型使用这个查询来自动找到它的关联产品?
这是一个helluva查询。你确定Cake不能为你处理这个关联吗?你能描述一下这个关联,并且/或者准确地描述你想从数据库返回的内容? – Stephen 2010-12-22 18:16:28
@Stephen,设计师HABTM标签,产品HABTM标签。包含了所有标签作为设计者的产品。此外,designers_tags表具有一个名为`include`的布尔字段(如果为false),则不应包含具有这些标签的任何产品。这样,我可以创建一个类别,并选择产品必须或不应具有哪些标签才能包含在该类别中。合理? – 2010-12-22 18:20:46