【发布时间】:2010-12-22 18:12:22
【问题描述】:
首先请注意,我是 MVC 框架的新手,所以不要假设在该领域有任何知识。
我有一个 Designer 模型,当我从 Designer 模型中检索信息时,我想为每个设计师提取相关的产品。
关联并不简单,所以 cake 不会为我神奇地做到这一点,所以我需要自己定义它。我一直在关注教程,我认为我很接近但不确定如何将它们联系在一起。
我有一个很长的查询,如果您在正确的位置插入 Designer_id,它将选择所有关联的产品。
我认为我应该将此查询放在 Designer 模型中的某个位置,以便它知道如何检索产品。
这里是查询,字符串中看起来像{$__cakeID__$}的部分需要替换为designer_id:
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 模型使用此查询来自动查找其关联产品?
【问题讨论】:
-
这是一个很好的查询。您确定 Cake 不能为您处理关联吗?您能否描述关联,和/或准确描述您希望从数据库返回的内容?
-
@Stephen,设计师 HABTM 标签,产品 HABTM 标签。包含所有标签为设计者的产品。此外,designers_tags 表还有一个名为
include的布尔字段,如果为 false,则不应包含任何带有这些标签的产品。这样我就可以创建一个类别并选择产品必须或不能包含哪些标签才能包含在该类别中。有意义吗? -
差不多明白了:您只需要那些标签与设计师完全相同的产品吗?或者您是否希望所有产品都具有设计师也拥有的 any 标签?
-
@Stephen,产品可以包含更多,但必须包含所有的设计师。
标签: php cakephp cakephp-1.3 cakephp-model