【发布时间】:2011-06-29 22:37:40
【问题描述】:
我有三张桌子
- 帖子
- 标签
- posts_tags
我需要编写一些控制器逻辑来选择和设置所有带有标签work的帖子
这意味着查询tags 以查找id 的查询标签,检查关联的posts_tags 表以查找匹配项,使用post_id 从帖子表中返回正确的帖子。
我什至不知道如何开始这个查询,我是 CakePHP 的新手,可以用手...拜托?
如果有帮助,这是我的帖子模型关系:
var $hasAndBelongsToMany = array(
'Tag' => array(
'className' => 'Tag',
'joinTable' => 'posts_tags',
'foreignKey' => 'posts_id',
'associationForeignKey' => 'tag_id',
'unique' => true,
'conditions' => '',
'fields' => '',
'order' => '',
'limit' => '',
'offset' => '',
'finderQuery' => '',
'deleteQuery' => '',
'insertQuery' => ''
)
);
我的 Tag 表由两个字段组成:id 和 tag
我的 PostsTag 表由三个字段组成:id、tag_id 和 post_id
我的帖子表由四个字段组成:id、title、body 和 created
我在 CakePHP Book 上找到了一些显示以下代码的代码:
$this->Recipe->Tag->find('all', array('conditions'=>array('Tag.name'=>'Dessert')));
他们认为这是一个类似的想法,所以我尝试适应:
$this->Post->Tag->find('all', array('conditions'=>array('Tag.tag'=>'work')));
但是,这没有奏效。这将返回所有帖子而不进行过滤。
我听取了@Leo 的建议,并尝试将他的代码改编为我的:
function getArticleByTagSql($tag) {
$dbo = $this->getDataSource();
$subQuery = $dbo->buildStatement(
array(
'fields' => array('DISTINCT(ArticlesTag.article_id)'),
'table' => "articles_tags",
'joins' => array(
array('table' => 'tags',
'alias' => 'Tag',
'type' => 'INNER',
'conditions' => array('ArticlesTag.tag_id = Tag.id')
)
),
'alias' => "ArticlesTag",
'conditions' => array("Tag.tag" => $tag),
'order' => null,
'group' => "ArticlesTag.article_id",
'limit' => null
),
$this
);
$subQuery = ' Article.id IN (' . $subQuery . ')';
return $dbo->expression($subQuery);
}
控制器:
$this->set('articles', $this->paginate(array(
'conditions' => $this->Article->getArticleByTagSql('work')
)));
但是,无论我在 paginate() 方法中键入什么作为键 - 在这种情况下,“条件”出现在查询中,我不知道为什么 - 我不断收到未知列“条件”错误。错误在于分页函数,没有它数据可以正确返回,但是没有它我不能使用分页器。这就像一个陷阱 22
干杯,
丹
【问题讨论】:
-
你能把你的标签表中的字段名贴出来吗?
-
@Headshota - 我已经更新了我的问题以包含它们。
-
Daniel 您错误地使用了分页,您没有在分页调用中声明“条件”。设置 $this->paginate['conditions'] = $this->Article->getArticleByTagSql('work');然后调用 $this->paginate('Article');
-
抱歉用帖子代替了文章!
-
@Leo,查询生成了一个不寻常的数组布局并且分页计数失败,所以我按照蛋糕书上的“高级分页”页面,我很好。干杯伙伴!
标签: php cakephp controller find