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