CakePHP从Tag获取相关帖子

时间:2011-06-29 22:37:40

标签: php cakephp controller find

我有三张桌子

  • 帖子
  • 标记
  • 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' => ''
        )
    );

我的代码表由两个字段组成:idtag
我的帖子标签表由三个字段组成:idtag_idpost_id
“我的帖子”表格由四个字段组成:idtitlebodycreated

我在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()方法中键入什么键 - 在这种情况下,“条件”出现在查询中,我无法弄清楚为什么 - 我一直得到未知列'条件'错误。错误是使用paginate函数,数据在没有它的情况下正确返回,但是没有它我就不能使用paginator。这就像一个捕获22

干杯,

3 个答案:

答案 0 :(得分:2)

如果您使用:

$this->Post->Tag->find('all'...

你告诉他找到所有标签的工作......并且由于它的递归,每个标签都会包含相关的帖子..

尝试这样做:

$this->Post->find('all'...

希望蛋糕足够聪明(如果你已正确设置你的模型关系)只选择具有“work”标签的帖子..如果这不起作用,你总是可以“手动”设置连接complex find condition

祝你好运

答案 1 :(得分:1)

Daniel在描述Receipe / Tag之间的HABTM关系时,Cake documentation实际回答了这个问题

answered this question对于与文章/标签模型存在类似问题的人,该答案使用了子查询

答案 2 :(得分:0)

我有同样的问题,但我尝试了这个查询,它对我有用......可能它也会对你有效:)

$claims = $this->Claim->query("SELECT DISTINCT Claim.id,Claim.title, Claim.description FROM
             claims as Claim
             LEFT JOIN claim_tags as ClaimTag ON Claim.id = ClaimTag.claim_id
            LEFT JOIN tags as Tag ON Tag.id =ClaimTag.tag_id
            WHERE Tag.id = '$id'");