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方法解决了分页问题。它现在运行良好。谢谢你的帮助!