【问题标题】:CakePHP Getting Associated Posts from TagCakePHP 从标签中获取相关帖子
【发布时间】: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 表由两个字段组成:idtag
我的 PostsTag 表由三个字段组成: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() 方法中键入什么作为键 - 在这种情况下,“条件”出现在查询中,我不知道为什么 - 我不断收到未知列“条件”错误。错误在于分页函数,没有它数据可以正确返回,但是没有它我不能使用分页器。这就像一个陷阱 22

干杯,

【问题讨论】:

  • 你能把你的标签表中的字段名贴出来吗?
  • @Headshota - 我已经更新了我的问题以包含它们。
  • Daniel 您错误地使用了分页,您没有在分页调用中声明“条件”。设置 $this->paginate['conditions'] = $this->Article->getArticleByTagSql('work');然后调用 $this->paginate('Article');
  • 抱歉用帖子代替了文章!
  • @Leo,查询生成了一个不寻常的数组布局并且分页计数失败,所以我按照蛋糕书上的“高级分页”页面,我很好。干杯伙伴!

标签: php cakephp controller find


【解决方案1】:

如果你使用:

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

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

尝试这样做:

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

希望 cake 足够聪明(并且如果您正确设置了模型关系)以仅选择具有“工作”标签的帖子。如果这不起作用,您始终可以使用“手动”设置连接complex find condition

祝你好运

【讨论】:

  • hmmm 现在我考虑了一下.. 这可能行不通:P.. 如果不行,请提供生成的查询 =)
  • 谢谢伙计,我会去的。我今晚下班回家后必须这样做,所以,如果您在地图的英国一端,预计会在 8 或 9 左右得到答案;)尽管为您的帮助干杯!
【解决方案2】:

Daniel 这个问题其实是在Cake documentation描述收据/标签之间的HABTM关系时回答的

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

【讨论】:

  • 我收到一个 SQL 错误:$sql = "SELECT COUNT(*) AS 'count' FROM 'articles' AS 'Article' WHERE 'conditions' = Article.id IN (SELECT DISTINCT(ArticlesTag.article_id) FROM articles_tags AS 'ArticlesTag' INNER JOIN tags AS 'Tag' ON ('ArticlesTag'.'tag_id' = 'Tag'.'id') WHERE 'Tag'.'tag' = 'work' GROUP BY 'ArticlesTag'.'article_id' ) " $error = "1054: Unknown column 'conditions' in 'where clause'" $out = null
  • 你把我带到了一些有趣的地方。最终,我通过覆盖 pagingCount 方法解决了分页问题。它现在工作正常。感谢您的所有帮助!
【解决方案3】:

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

$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'");

【讨论】:

    猜你喜欢
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多