CakePHP从标记获取相关帖子
我有三张桌子CakePHP从标记获取相关帖子,php,cakephp,controller,find,Php,Cakephp,Controller,Find,我有三张桌子 职位 标签 张贴标签 我需要编写一些控制器逻辑来选择和设置所有具有标签work 这意味着查询标记以查找所查询标记的id,在关联的posts_标记表中检查以查找匹配项,使用post_id从posts表返回正确的post 我甚至不知道如何开始这个查询,我是CakePHP新手,可以用一只手。。。求你了 如果有帮助,下面是我的帖子模型关系: var $hasAndBelongsToMany = array( 'Tag' => array(
- 职位
- 标签
- 张贴标签
work
这意味着查询标记
以查找所查询标记的id
,在关联的posts_标记
表中检查以查找匹配项,使用post_id
从posts表返回正确的post
我甚至不知道如何开始这个查询,我是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' => ''
)
);
我的标记表由两个字段组成:id
和Tag
我的PostsTag表由三个字段组成:
id
、tag\u id
和post\u id
我的帖子表由四个字段组成:
id
、title
、body
和created
我在CakePHP书中找到了一些代码,其中显示了以下代码:
$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()方法中键入什么作为键——在本例中,“条件”出现在查询中,我不知道为什么——我总是得到未知列“条件”错误。错误在于paginate函数,没有它,数据会正确返回,但是没有它,我无法使用paginator。这就像是第22条军规
干杯,Dan如果您使用:
$this->Post->Tag->find('all'...
你要他找到所有的标签。。。由于它是递归的,每个标记都将包含相关的帖子
尝试这样做:
$this->Post->find('all'...
希望cake足够聪明(如果你正确设置了模型关系),只选择带有“工作”标签的帖子。。如果这不起作用,您可以使用
祝您好运,如果您使用:
$this->Post->Tag->find('all'...
你要他找到所有的标签。。。由于它是递归的,每个标记都将包含相关的帖子
尝试这样做:
$this->Post->find('all'...
希望cake足够聪明(如果你正确设置了模型关系),只选择带有“工作”标签的帖子。。如果这不起作用,您可以使用
祝您好运Daniel在描述Receipe/Tag之间的HABTM关系时,这个问题实际上在中得到了回答
对于那些对文章/标签模型有类似问题的人,这个答案使用了子查询Daniel当描述Receipe/Tag之间的HABTM关系时,这个问题实际上在中得到了回答
我为一个对文章/标签模型有类似问题的人提供了答案,该答案使用了子查询我也有同样的问题,但我尝试了这个查询,它对我有效……可能它也对你有效:)
我也有同样的问题,但我尝试了这个查询,它对我有效…也许它也对你有效:)
你能在标记表中公布哪些字段名吗?@Headshota-我已经更新了我的问题以包括它们。Daniel你使用的paginate不正确,你没有在paginate调用中声明“条件”。设置$this->paginate['conditions']=$this->Article->getArticleByTagSql('work');然后调用$this->paginate('Article');对不起,用帖子代替文章@Leo,查询生成了一个不寻常的数组布局,分页计数失败,所以我遵循了蛋糕书上的“高级分页”页面,我很好。干杯,伙计!你能在标记表中公布哪些字段名吗?@Headshota-我已经更新了我的问题以包括它们。Daniel你使用的paginate不正确,你没有在paginate调用中声明“条件”。设置$this->paginate['conditions']=$this->Article->getArticleByTagSql('work');然后调用$this->paginate('Article');对不起,用帖子代替文章@Leo,查询生成了一个不寻常的数组布局,分页计数失败,所以我遵循了蛋糕书上的“高级分页”页面,我很好。干杯,伙计!嗯,现在我想起来了。。这可能不起作用:P。。如果没有,请提供生成的查询=)谢谢,伙计,我来试试。今晚下班回家后我就得去做了,所以,如果你在英国的话,希望你能在8点或9点左右得到答案为你的帮助干杯!嗯,现在我想起来了。。这可能不起作用:P。。如果没有,请提供生成的查询=)谢谢,伙计,我来试试。今晚下班回家后我就得去做了,所以,如果你在英国的话,希望你能在8点或9点左右得到答案为你的帮助干杯!我得到了一个SQL错误:
$SQL=“选择COUNT(*)作为'articles'中的'COUNT'作为'Article'中的'conditions'=Article.id(从articles中选择DISTINCT(ArticlesTag.Article\u id)作为'ArticlesTag'内部连接标记作为'Tag'ON('ArticlesTag.'Tag\u id'='Tag''id'),其中'Tag.'Tag''Tag''Tag'='work'组由'ArticlesTag.'Article\u id')“$error=“1054:where子句”“中的未知列‘conditions’”$out=null
您引导我进入了一个有趣的领域。最终,我通过重写pagingCount方法解决了分页问题。它现在运行良好。谢谢你的帮助!我得到了一个SQL错误:$SQL=“选择COUNT(*)作为'articles'中的'COUNT'作为'Article'中的'conditions'=Article.id(从articles中选择DISTINCT(ArticlesTag.Article\u id)作为'ArticlesTag'内部连接标记作为'Tag'ON('ArticlesTag.'Tag\u id'='Tag''id'),其中'Tag.'Tag''Tag''Tag'='work'组由'ArticlesTag.'Article\u id')“$error=“1054:where子句”“中的未知列‘conditions’”$out=null
您引导我进入了一个有趣的领域。最终,我通过重写pagingCount方法解决了分页问题。它现在运行良好。谢谢你的帮助!