Php 如何告诉模型如何查找其关联模型?

Php 如何告诉模型如何查找其关联模型?,php,cakephp,cakephp-1.3,cakephp-model,Php,Cakephp,Cakephp 1.3,Cakephp Model,首先让我注意到,我是MVC框架的新手,所以不要假设在这方面有任何知识 我有一个设计器模型,当我从设计器模型中检索信息时,我想为每个设计器提取关联的产品 这种联系并不简单,所以蛋糕不会神奇地为我做这件事,所以我需要自己来定义它。我一直在学习教程,我想我已经很接近了,但不确定如何把它们联系在一起 我有一个很长的查询,如果您在正确的位置插入designer_id,它将选择所有关联的产品 我想我应该把这个查询放在Designer模型的某个地方,这样它就知道如何检索产品 这是查询,字符串中类似于{$\uu

首先让我注意到,我是MVC框架的新手,所以不要假设在这方面有任何知识

我有一个设计器模型,当我从设计器模型中检索信息时,我想为每个设计器提取关联的产品

这种联系并不简单,所以蛋糕不会神奇地为我做这件事,所以我需要自己来定义它。我一直在学习教程,我想我已经很接近了,但不确定如何把它们联系在一起

我有一个很长的查询,如果您在正确的位置插入designer_id,它将选择所有关联的产品

我想我应该把这个查询放在Designer模型的某个地方,这样它就知道如何检索产品

这是查询,字符串中类似于
{$\uuuukeid\uuuukeid}
的部分需要替换为
设计器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
)
以下是designer模型:

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';
}

我需要做什么才能使设计师模型使用此查询自动查找其关联的产品?

此查询应使用临时联接和可包含行为:

// 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关系,
Designer
Product
、和
Tag
(Tag应该有两个HABTM关联)

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

编辑

如果您找不到CakePHP解决方案,并且最终需要使用原始查询,CakePHP可以使用该模型。请理解,在使用此方法时,您正在放弃某些功能。也要注意食谱中的建议:

如果您在应用程序中使用此方法,请务必查看CakePHP的Sanitize库,它有助于从注入和跨站点脚本攻击中清除用户提供的数据


这是一个很好的查询。你确定蛋糕帮不了你吗?你能描述一下关联,和/或描述一下你想要从数据库返回什么吗?@Stephen,设计师HABTM标签,产品HABTM标签。包含作为设计器的所有标记的产品。此外,designers_tags表有一个名为
include
的布尔字段。如果为false,则不应包括带有这些标签的任何产品。这样,我可以创建一个类别,并选择产品必须或不必须有哪些标签才能包含在类别中。有意义吗?几乎明白了:你只需要那些与设计师标签完全相同的产品吗?或者你想让所有的产品都有设计师的标签吗?@Stephen,这些产品可以包含更多,但必须包含设计师的所有标签。你最后的评论使我的回答无效。。。谢谢你的回答,我可以试着用你的解决方案,看看我能从中得到什么。我如何告诉它不包括包含任何include=0标记的产品?我是否要添加类似“FilterDesignersTag.include!=”=>0
到条件数组?谢谢我告诉它只包括那些带有
FilterDesignersTag.include=1
的。看看最后的条件。